zoukankan      html  css  js  c++  java
  • 【设计模式】装饰者模式

    参考链接:http://www.cnblogs.com/mengdd/archive/2013/02/12/2910302.html

    装饰者模式(Decorator):

      装饰者模式又称为包装模式。

      装饰模式以客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

      装饰模式通过创建一个包装对象,也就是装饰来包裹真实的对象。

      装饰模式以对客户端透明的方式动态地给一个对象附加更多的责任。

      装饰模式可以在不创建更多子类的情况下,对对象的功能加以扩展。是替代继承扩展功能的一个方案。

      装饰模式把客户端的调用委派到被装饰类。装饰模式的关键在于这种扩展是完全透明的。

    装饰模式的角色:

      抽象构建角色(Component):给出一个抽象接口,以规范准备接受附加责任的对象。

      具体构建角色(Concreate Component):定义将要接受附加责任的类。

      装饰角色(Decorator):持有一个构建对象的引用,并定义一个与抽象构建接口一致的接口。

      具体装饰角色(Concreate Decorator):负责给构建对象贴上 附加的责任。

    JAVA IO中的装饰模式:

      在IO中,具体构建角色是节点流,装饰角色是过滤流。过滤流担任了过滤文件的角色。

      FilterInputStream和FilterOutputStream是装饰角色,其派生自他们的类则是具体装饰角色。

    装饰模式的特点:

      装饰对象和真实对象有相同的接口,这样客户端对象就可以和真实对象以相同的方式和装饰对象进行交互。

      装饰对象包含一个真实对象的引用。

      装饰对象接口所有来自客户端的请求,它把这些请求转发给真实的对象。

      装饰对象可以转发这些请求后附加一些功能。

    程序实例:  

      1. 抽象构建角色:

    /**
     * 抽象构件角色,以规范准备接受附加责任的对象
     * @author rding
     *
     */
    public interface Component {
        void doSomething();
    }

      2.具体构建角色:

    /**
     * 具体构件角色,要接受附加责任的类
     * @author rding
     */
    public class ConcreteComponent implements Component{
        @Override
        public void doSomething() {
            System.out.println("功能A");
        }
    }

      3. 装饰角色:持有一个构建对象角色的引用

    /**
     * 装饰角色
     * @author rding
     *
     */
    public class Decorator implements Component{
        
        private Component component;
        
        public Decorator(Component component) {
            super();
            this.component = component;
        }
    
        @Override
        public void doSomething() {
            component.doSomething();
        }
    
    }

      4.具体装饰角色1

    /**
     * 具体装饰角色1
     * @author rding
     */
    public class ConcreteDecorator1 extends Decorator {
    
        public ConcreteDecorator1(Component component) {
            super(component);
        }
        @Override
        public void doSomething() {
            super.doSomething();
            doAnotherThing();
        }
        private void doAnotherThing() {
            System.out.println("功能B");
        }
    }

      具体装饰角色2:

    /**
     * 具体装饰角色2
     * @author rding
     */
    public class ConcreteDecorator2 extends Decorator{
    
        public ConcreteDecorator2(Component component) {
            super(component);
        }
        @Override
        public void doSomething() {
            super.doSomething();
            this.doAnthing();
        }
        private void doAnthing() {
            System.out.println("功能C");
        }
    }

       5.客户端调用:

    public class Client {
    
        public static void main(String[] args) {
            Component component = new ConcreteComponent();
            Component component1 = new ConcreteDecorator1(component);
            component1.doSomething();
            System.out.println("----------------------");
            
            Component component2 = new ConcreteDecorator2(component1);
            component2.doSomething();
        }
        
    }

      结果:

    功能A
    功能B
    ----------------------
    功能A
    功能B
    功能C
  • 相关阅读:
    windows权限维持之注册表
    mstsc痕迹清理
    内网常用爆破手法
    RDP攻击&防御
    Java SPI 机制
    mysqldump 数据库备份
    Redis分布式锁
    Seata分布式事务中间件学习和实践
    pytube
    idea github登录
  • 原文地址:https://www.cnblogs.com/lfdingye/p/7357667.html
Copyright © 2011-2022 走看看