装饰者模式

来源:互联网 发布:网络软件工程师培训 编辑:程序博客网 时间:2024/05/20 22:02
装饰者模式


1、意图: 动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。该模式以对客 户端透明的方式扩展对象的功能。


2、适用环境


(1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。


(2)处理那些可以撤消的职责。


(3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的 子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。


3、参与者


    1.Component(被装饰对象的基类)


      定义一个对象接口,可以给这些对象动态地添加职责。


    2.ConcreteComponent(具体被装饰对象)


      定义一个对象,可以给这个对象添加一些职责。


    3.Decorator(装饰者抽象类)


      维持一个指向Component实例的引用,并定义一个与Component接口一致的接口。


    4.ConcreteDecorator(具体装饰者)


      具体的装饰对象,给内部持有的具体被装饰对象,增加具体的职责。

    5.类图:

 

6 具体实现

abstractcomponent类:

phone.java

package com.heima.decorate;public interface Phone {   public void call();   public void attribute();}
abstractDecorator类:

AbstractDecorator.java

package com.heima.decorate;public abstract class AbstractDecotator implements Phone {private Phone phone;public void setPhone(Phone phone) {this.phone = phone;}public void call() {phone.call();}public void attribute() {phone.attribute();}}
component类

Iphone.java

package com.heima.decorate;public class Iphone implements Phone {public void attribute() {    System.out.println("美国产");}public void call() {System.out.println("用iphone打电话");}}

Decorator类:

RealDecorator.java

package com.heima.decorate;public class RealDecorate extends AbstractDecotator {    @Override    public void call() {    super.call();    recall();    System.out.println("这是RealDecorateA");    }    public static void recall(){    System.out.println("打长途电话");    }}
test类:

package com.heima.decorate;public class TestDecorate {/** * @param args */public static void main(String[] args) {    Iphone ip=new Iphone();    RealDecorate rd=new RealDecorate();    rd.setPhone(ip);    rd.call();}}
打印结果:

用iphone打电话打长途电话这是RealDecorateA


转载自:http://www.cnblogs.com/chenxing818/p/4705919.html






0 0
原创粉丝点击