设计模式-基础概念入门
创建型
工厂方法:隔离创建对象的细节,使得创建对象的行为可扩展
抽象工厂:该模式抽象出一组相关对象的接口
建造者:与工厂不同的是,该模式包含了对象构造的若干过程
原型:用于以某个对象为模子创建一个新对象的场景,例如幻灯片中的母版与普通页、对象的克隆
单例
结构型
适配器:处理遗留系统的不二法宝,也可以用空方法实现接口作为抽象父类
桥接:使用关联代替继承,解决类多维度的扩展导致的类爆炸问题
组合:将组件组装为整体使用
装饰:常见于各种wrapper,常用于在原函数执行前后做一些额外的工作
外观:封装扇出,利用树状减少调用者的复杂度
假设我们有一个计算机类,它有许多复杂的子系统,如CPU、内存、硬盘等。我们可以使用外观模式来隐藏这些子系统的复杂性,提供一个简单的接口给客户端使用。
private CPU cpu;
private Memory memory;
private HardDrive hardDrive;
public Computer() {
this.cpu = new CPU();
this.memory = new Memory();
this.hardDrive = new HardDrive();
}
public void start() {
cpu.start();
memory.start();
hardDrive.start();
}
public void shutdown() {
cpu.shutdown();
memory.shutdown();
hardDrive.shutdown();
}
}
``` 然后,我们定义一个外观类,它提供了一个简单的接口给客户端使用:
public class ComputerFacade { private Computer computer; public ComputerFacade() { this.computer = new Computer(); } public void start() { computer.start(); } public void shutdown() { computer.shutdown(); } }
最后,我们可以使用外观类来启动和关闭计算机:
public class Client { public static void main(String[] args) { ComputerFacade computerFacade = new ComputerFacade(); computerFacade.start(); // do some work computerFacade.shutdown(); } }
在这个示例中,客户端只需要使用外观类提供的简单接口来启动和关闭计算机,而不需要了解计算机的复杂子系统。外观类将客户端的请求委托给计算机类进行处理。
亨元模式(Flyweight Pattern)是一种结构型设计模式,它旨在通过共享对象来最大程度地减少内存使用和对象创建的开销。该模式适用于需要创建大量相似对象的情况,通过共享这些对象的公共部分,可以节省内存空间。 在Java中,我们可以使用亨元模式来实现对象的共享。下面是一个简单的示例,展示了如何使用亨元模式来共享字符串对象:
import java.util.HashMap; import java.util.Map; public class FlyweightPatternExample { private static final Map<String, String> flyweights= new HashMap<>); public static String getSharedString(String key) { if (!flyweights.containsKey(key)) { flyweights.put(key, new String(key)); return flyweights.get(key); public static void main(Stringll args) { String str1 = getSharedString("Hello"); String str2= getSharedString("World"): String str3 = getSharedString("Hello"); System.out.println(str1 == str2); // false System.out.println(str1 == str3); // true }
在上面的示例中,`getSharedString`方法用于获取共享的字符串对象。如果该字符串对象已经存在于`flyweights`缓存中,则直接返回该对象;否则,创建一个新的字符串对象并将其添加到缓存中。通过使用亨元模式,我们可以看到`str1`和`str3`实际上引用了同一个字符串对象,而`str2`引用了另一个不同的字符串对象。 这样,通过共享相同的字符串对象,我们可以节省内存空间,并提高程序的性能。
享元模式的优势在于共享内部状态,减少对象的创建和内存占用。而外部状态则是不可共享的,需要在使用时传递给享元对象。
举个例子,假设有一个游戏中的棋盘,棋盘上有很多棋子,每个棋子都有自己的颜色和位置。如果使用传统的方式创建棋子对象,每个棋子都会占用一定的内存空间。但是如果使用享元模式,可以将棋子的颜色作为内部状态,而位置作为外部状态。这样,如果有多个棋子颜色相同,那么它们可以共享同一个内部状态,减少内存占用。而每个棋子的位置则是不同的,需要在使用时传递给享元对象。 如果棋盘上的棋子数量很多,使用享元模式可以大大减少内存占用,提高程序的性能。但是如果每个棋子的颜色都不同,那么就无法共享内部状态,享元模式的优势就会减弱。
行为型
解释器:一般用于解释执行自定义的某种语法
模版方法:框架与钩子
责任链:责任链模式是一种行为设计模式,它允许多个对象按照顺序处理请求,直到其中一个对象能够处理请求为止。每个对象都可以选择将请求传递给下一个对象,也可以选择自己处理请求。
abstract class Handler { protected Handler nextHandler; public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; } public abstract void handleRequest(int request); } class ConcreteHandler1 extends Handler { @Override public void handleRequest(int request) { if (request >= 0 && request < 10) { System.out.println("ConcreteHandler1 处理请求:" + request); } else if (nextHandler != null) { nextHandler.handleRequest(request); } } } class ConcreteHandler2 extends Handler { @Override public void handleRequest(int request) { if (request >= 10 && request < 20) { System.out.println("ConcreteHandler2 处理请求:" + request); } else if (nextHandler != null) { nextHandler.handleRequest(request); } } } class ConcreteHandler3 extends Handler { @Override public void handleRequest(int request) { if (request >= 20 && request < 30) { System.out.println("ConcreteHandler3 处理请求:" + request); } else if (nextHandler != null) { nextHandler.handleRequest(request); } } } public class Main { public static void main(String[] args) { Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); Handler handler3 = new ConcreteHandler3(); handler1.setNextHandler(handler2); handler2.setNextHandler(handler3); handler1.handleRequest(5); handler1.handleRequest(15); handler1.handleRequest(25); } }
命令:将行为抽象和解耦
迭代器:封装数据的访问行为(顺序、可见性等)
中介者:用一个中介对象来封装一系列的交互;新增一个模块处理两个模块的交互
备忘录模式:将当前对象的状态信息保存为一个对象,使得当前对象可以基于状态镜像快速恢复原状态
观察者:订阅、发布模型,用于事件驱动的设计
状态:封装FSM(有限状态机)的状态与状态转移,每个状态定义了自身的输入与状态转移
策略:使用接口即使用strategy,用于隔离变化
访问者:数据与行为分离方法。通过这种分离,可达到一个被访问者动态添加新的操作而无需做其他的修改的效果