装饰者模式又叫包装模式,定义如下:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类来说更为灵活。
装饰者模式的类图如上:
从图中可以看到装饰着模式涉及到四个角色:
1.抽象构件角色Component
Component可以是一个接口或者抽象类,主要是定义一些规则
2.具体构件角色ConcreteComponent
ConcreteComponent是抽象构件的实现类同时也是被装饰的对象
3.Decorator抽象装饰者角色
一般是一个抽象者对象,同时实现抽象构件角色中定义的功能,并且含有一个私有属性执行抽象构件
4.具体装饰者角色
主要是用来装饰具体构件角色
/** * 抽象构件 * */ public abstract class Component { // 抽象方法 protected abstract void operation(); }
/** * 具体构件 * */ public class ConcreteComponent extends Component { /** * */ @Override protected void operation() { System.out.println("Hello World!"); } }
public abstract class Decorator extends Component { private Component component; public Decorator(Component component) { this.component = component; } /** * */ @Override protected void operation() { component.operation(); } }
public class ConcreteDecorator extends Decorator { /** * @param component */ public ConcreteDecorator(Component component) { super(component); } // 装饰方法 private void doSomething() { System.out.println("装饰"); } @Override protected void operation() { doSomething(); super.operation(); } }
public class Client { public static void main(String[] args) { //被装饰者 Component component=new ConcreteComponent(); //装饰者 Decorator decorator=new ConcreteDecorator(component); //装饰 decorator.operation(); } }
看完装饰模式大家可能会有一些疑问,不就是要重新扩张一个方法的功能吗?我直接集成具体构件类重写里面的方法不就行了吗?其实装饰者模式是继承关系的一种替代方案,集成是一种高侵入性的,况且我们做开发的也知道,需求是无止境的,你根本不知道用户的需求最终会变成什么样,也许有一天需求变了,那么你难道还要再次集成然后重写里面的方法吗?
装饰者模式的优点:
1.装饰类和被装饰的对象可以独立发展不必互相耦合
2.装饰者模式是继承关系的一种替代
当然装饰者模式也是有缺点的,那就是装饰者的实现类可能会出现类膨胀的情况的,所以是否需要使用装饰者模式就要看具体的情况了。
装饰的使用场景
1.需要扩展一个类的功能或给一个类增加附加功能
2.需要动态的给一个对象增加功能并且这些功能可以动态的撤销
3.需要为一批兄弟类进行改装或增加功能
相信大家都做过文件上传获取其他和IO相关的操作,其实java IO中主要使用模式就是装饰者模式,大家可以想象上面的问题,如果为了增强一个类的功能我们就使用继承的话,那么java IO的实现如果使用继承一定会很可怕的.....
下面是一张java IO使用装饰者模式的简单类图:
相关推荐
java设计模式之装饰者模式代码
Qt设计模式之装饰者模式
设计模式之装饰者模式,极客学院VIP课堂的课件,装饰者模式的示例
javascript设计模式之装饰者模式.docx
装饰者模式是在不改变原有类和不使用继承的情况下,动态地扩展一个对象的功能,代码中通过对象参数进行选择。
设计模式--装饰者模式java例子
// 第10步:执行RedBalls对象的decorate方法总结装饰者模式是为已有功能动态地添加更多功能的一种方式,把每个要装饰的功能放在单独的函数里,然后用
c# ,设计模式,装饰者模式,星巴兹咖啡,基本上就是head first 上的例子的C#实现,根据自己的理解,作了一点点改动,可以直接运行。
设计模式—装饰者模式
设计模式—装饰者模式,介绍的非常详细,讲解透彻
NULL 博文链接:https://jacky-dai.iteye.com/blog/1132229
设计模式 - 装饰者模式
软件设计模式之装饰模式讲解ppt,可用于教学课件。
54-Spring设计模式之装饰器模式1
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
设计模式 c# 装饰模式
使用PHP实现的设计模式之装饰者模式,希望对您的开发有所启发。
设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...