美文网首页
设计模式-装饰模式(八)

设计模式-装饰模式(八)

作者: 巨子联盟 | 来源:发表于2018-05-23 16:25 被阅读0次

    装饰器模式是一种对客户端透明的方式扩展对象的功能,是继承关系的一种替代方案
    装饰类的排列组合

    装饰模式.png

    利用装饰类的排列组合可以产生不同效果,比继承功能强大
    虽然装饰模式比继承强大可以随便排列组合,但是也容易出错,比如弄个死循环或者奇葩的东东出来

    合成模式的区别:
    合成模式,树型结构,分树枝和树叶,
    和合成模式类似都是传递一个实现了共同接口的类进去,
    但是合成模式一般是树枝包含很多个(所以它要add,remove等方法),这个装饰模式就一个

    • 装饰模式可以为合成模式添加新的行为

    • 装饰模式和适配器模式的区别在于,装饰器是为了增强所考虑对象的功能,
      而适配器是为了改变所考虑对象的接口而不改变其功能

    • 代码示例:
    1. 先定一个接口,抽象构件角色,装饰类和其他类都要实现
    package com.byedbl.decorator;
    
    /**
     *  The top abstract where concrete component and decorator
     *  should be derived from
     */
    public interface Component  {
        void printString(String s);
    }
    
    1. 定义一个实现类,
    package com.byedbl.decorator;
    /**
     *  A Concrete Component
     */
    public class ConcreteComponent implements Component {
        public ConcreteComponent() {
        }
        public void printString(String s) {
            System.out.println("Input String is:" + s);
        }
    }
    
    1. 现在我们想对ConcreteComponent 的功能进行扩展,利用装饰模式,我们先定义一个装饰类
    package com.byedbl.decorator;
    
    /**
     *  The Decorator
     */
    public class Decorator implements Component {
        private Component component;
        public Decorator(Component c) {
            component = c;
        }
        public void printString(String s) {
            component.printString(s);
        }
    }
    
    1. 实现一种装饰
    package com.byedbl.decorator;
    /**
     *  The Concrete Decorator
     */
    public class ConcreteDecoratorA extends Decorator {
        public ConcreteDecoratorA(Component c) {
            super(c);
        }
        public void printString(String s) {
            super.printString(s);
            printStringLen(s);
        }
        public void printStringLen(String s) {
            System.out.println("The length of string is:" + s.length());
        }
    }
    
    1. 实现另外一种装饰类
    package com.byedbl.decorator;
    /**
     *  The Concrete Decorator
     */
    public class ConcreteDecoratorB extends Decorator {
        public ConcreteDecoratorB(Component c) {
            super(c);
        }
        public void printString(String s) {
            super.printString(s);
            printStringLen(s);
        }
        public void printStringLen(String s) {
            System.out.println("BBBBBBBBBBBBBBBBBBB");
    
        }
    }
    
    1. 然后客户端就可以随意的排列组合产生不同的功能了
    package com.byedbl.decorator;
    
    /**
     *  <pre>
     *  A simple test
     *  利用装饰类的排列组合可以产生不同效果,比继承功能强大
     *
     *  合成模式的区别:
     *  合成模式,树型结构,分树枝和树叶,
     *  和合成模式类似都是传递一个实现了共同接口的类进去,
     *  但是合成模式一般是树枝包含很多个(所以它要add,remove等方法),这个装饰模式就一个
     *
     *  装饰模式可以为合成模式添加新的行为
     *
     *  装饰模式比继承强大可以随便排列组合,但是也容易出错,比如弄个死循环或者奇葩的东东出来
     *
     *  装饰模式和适配器模式的区别在于,装饰器是为了增强所考虑对象的功能,
     *      而适配器是为了改变所考虑对象的接口而不改变其功能
     *
     */
    public class Test1  {
        public static void main(String[] args) {
            Component myComponent = new ConcreteComponent();
            myComponent.printString("A test String");
            Decorator myDecorator = new ConcreteDecoratorA(myComponent);
            myDecorator.printString("A test String");
            myDecorator = new ConcreteDecoratorB(myDecorator);
            myDecorator.printString("B test String");
        }
    }
    

    输出:

    Input String is:A test String
    Input String is:A test String
    The length of string is:13
    Input String is:B test String
    The length of string is:13
    BBBBBBBBBBBBBBBBBBB
    

    实例有:JDK源码IO部分


    image.png

    相关文章

      网友评论

          本文标题:设计模式-装饰模式(八)

          本文链接:https://www.haomeiwen.com/subject/dgoljftx.html