23种设计模式总览
创建型模式
结构型模式
- 外观模式(Facade)
- 适配器模式(Adapter)
- 代理模式(Proxy)
- 组合模式(Composite)
- 享元模式(Flyweight)
- 装饰模式(Decorator)
- 桥接模式(Bridge)
行为型模式
- 中介者模式(Mediator)
- 观察者模式(Observer)
- 命令模式(Command)
- 迭代器模式(Iterator)
- 模板方法模式(Template Method)
- 策略模式(Strategy)
- 状态模式(State)
- 备忘录模式(Memento)
- 解释器模式(Interpreter)
- 职责链模式(Chain of Responsibility)
- 访问者模式(Visitor)
定义
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
使用场景
1、扩展一个类的功能。
2、动态增加功能,动态撤销。
就是主要为了方便扩展。
在一个类在扩展功能时,如果通过继承的方式扩展,随着功能增加越来越多时,就会导致子类爆炸。
优缺点
优点: 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点: 多层装饰比较复杂。
示例
1.有一个鸭子,他学会说话
public interface DuckStudy {
void study();
}
class Duck implements DuckStudy {
@Override
public void study() {
System.out.println("我会嘎嘎嘎啦");
}
}
2.过了几天又学会了fly的功能,于是你请朋友帮忙添加这个功能,但是你朋友担心直接修改Duck内部会有影响,于是使用了装饰者模式来实现
public abstract class Decorator implements DuckStudy {
protected DuckStudy duckStudy;
public Decorator(DuckStudy duckStudy) {
this.duckStudy = duckStudy;
}
@Override
public void study() {
duckStudy.study();
}
}
class DuckDecorator extends Decorator{
public DuckDecorator(DuckStudy duckStudy) {
super(duckStudy);
}
@Override
public void study() {
super.study();
//我现在又学会了一个功能
addFly();
}
private void addFly() {
System.out.println("我学会了一个新技能---我会飞啦");
}
}
3.执行结果
public class TestDemo {
public static void main(String[] args) {
Duck duck = new Duck();
DuckDecorator duckDecorator = new DuckDecorator(duck);
duckDecorator.study();
}
}
我会嘎嘎嘎啦
我学会了一个新技能---我会飞啦