设计模式(七)——装饰模式
来源:互联网 发布:皮影客软件介绍 编辑:程序博客网 时间:2024/05/17 07:51
定义
<span style="font-family:Microsoft YaHei;font-size:14px;">Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality</span>
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比添加子类更加灵活。
类图
涉及四个角色:
★ Component抽象构件:
一个接口或者抽象类,定义核心对象,也就是原始的对象。
★ ConcreteComponent具体构件
最原始最基本接口或抽象类的具体实现,是要装饰的目标
★ Decorator装饰角色
一般是一个抽象类,实现接口或者抽象方法,类中不一定有抽象方法,但是它属性中必须有一个private变量指向Component抽象构件。
★ 具体装饰角色
ConcreteComponentA和ConcreteComponentB是两个具体的装饰类。
实现
抽象构件
public abstract class Component {public abstract void operate();}
具体构件
public class ConcreteComponent extends Component {@Overridepublic void operate() {System.out.println("初始的实现类~要把我包装下哦~");}}
抽象装饰者
public abstract class Decorator extends Component {private Component component=null;//通过构造函数传递被修饰者public Decorator(Component component){this.component=component;}//委托给被修饰者执行@Overridepublic void operate() {this.component.operate();}}
具体装饰角色<只写一个>
public class ConcreteDecorator1 extends Decorator {//定义被修饰者public ConcreteDecorator1(Component component) {super(component);}//定义包装方法private void decoratorMethod1(){System.out.println("包装类的第一次包装~");}//重写父类的Operate方法public void operate(){this.decoratorMethod1();super.operate();}}
场景类
public class Client {public static void main(String[] args) {//定义要装饰的原始类Component component = new ConcreteComponent();//第一次修饰component = new ConcreteDecorator1(component);//第二次修饰component = new ConcreteDecorator2(component);component.operate();}}
输出
包装类的第一次包装~初始的实现类~要把我包装下哦~包装完整~
优缺点:
优点:
- 装饰类和被装饰类可以独立发展,换句话说,Component类无须知道Decorator类,Decorator类是从外部来扩展Component类的功能,而Decorator类也不用知道具体构件。
- 装饰模式是继承关系的一个替代方案,不管装饰多少层,返回的对象仍然是Component,实现的还是is-a关系。
- 可以动态的扩展一个类的功能。
缺点:
多层装饰比较复杂,装饰类多时系统复杂度较高,不容易发现问题所在。
应用场景:
需要扩展类的功能,或给类增加一个附加功能;
需要动态地给一个对象增加功能,这些功能可以撤销;
装饰模式动态扩展性非常强,比如有三个继承关系的类:Father、Son、GrandSon,如果要在Son类上增加功能,这时如果修改Son的方法那个对其子类GrandSon影响非常大,这时就可以建立SonDecorator类来修饰Son,相当于建立了新类,但是对原有的程序没有特别大的影响,很好的完成了扩展。
0 0
- 设计模式(七)——装饰模式
- AspectJ实现设计模式(七)—装饰模式
- Java设计模式(七)----装饰模式
- 设计模式(七)装饰模式
- 设计模式(七)装饰模式
- 设计模式(七):装饰模式
- JAVA设计模式(七)——装饰模式
- 【设计模式】【七】装饰模式
- 设计模式—装饰模式(三)
- 设计模式—装饰模式
- 设计模式—装饰模式
- 设计模式—装饰模式
- 设计模式—装饰模式
- 设计模式—装饰模式
- Java面向对象设计模式(七)——装饰模式(Decorator)
- 浅谈Java设计模式(七)装饰模式(Decorator)
- 设计模式(七)装饰者和观察者模式
- 设计模式学习系列七:装饰模式(Decorator)
- 我的软实力
- 关于HashMap很好的博文-推荐
- 一个普通的.线段树
- PHP cURL
- AIM Tech Round 3 (Div. 2)
- 设计模式(七)——装饰模式
- 初识UML
- TimesIsMoney
- Gym 100818B Tree of Almost Clean Money
- 基于svg mask实现的tab切换效果
- LeetCode Product of Array Except Self
- 接口与实现
- 进程
- 学习《跟我一起写makefile》笔记2