装饰模式

作者: fancy_boy_石嘉成 | 来源:发表于2018-07-29 17:45 被阅读16次

    《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。
    目录:设计模式
    Github地址:DesignPattern

    说明

    定义:装饰模式(Decorator)动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

    UML图:

    装饰模式UML图.png

    代码实现:

    Component类

    abstract class Component {
        public abstract void operation();
    }
    

    ConcreteComponent类

    class ConcreteComponent extends Component{
    
        @Override
        public void operation() {
            System.out.println("具体对象的操作");
        }
    }
    

    Decorator类

    abstract class Decorator extends Component{
        protected Component component;
    
        public void setComponent(Component component) {
            this.component = component;
        }
    
        @Override
        public void operation() {
            // 重写operation(),实际上执行的是Component的operation()
            if (component!=null){
                component.operation();
            }
        }
    }
    
    

    ConcreteDecorator 具体实现类

    class ConcreteDecoratorA extends Decorator{
    
        //本类的独有功能,以区别于ConcreteDecoratorB
        private String addedState;
        @Override
        public void operation() {
            super.operation();
            addedState = "New State";
            System.out.println("具体装饰对象A的操作");
        }
    }
    
    class ConcreteDecoratorB extends Decorator{
    
        @Override
        public void operation() {
            super.operation();
            AddBehavior();
            System.out.println("具体装饰对象B的操作");
        }
    
        //本类的独有方法,以区别于ConcreteDecoratorA
        private void AddBehavior(){
    
        }
    }
    

    客户端代码

    public class DecoratorPattern {
        public static void main(String[] args){
            ConcreteComponent c = new ConcreteComponent();
            ConcreteDecoratorA d1 = new ConcreteDecoratorA();
            ConcreteDecoratorB d2 = new ConcreteDecoratorB();
    
            /*
            装饰的方法是:首先用ConcreteComponent实例化对象c,然后用
            ConcreteDecoratorA的实例化对象d1来包装c,再用ConcreteDecoratorB
            的对象d2包装d1,最终执行d2的operation()
             */
            d1.setComponent(c);
            d2.setComponent(d1);
            d2.operation();
        }
    }
    

    运行结果

    具体对象的操作
    具体装饰对象A的操作
    具体装饰对象B的操作
    

    示例

    例子:之前玩QQ空间的时候,总会装扮空间,打扮形象,可以给qq的角色搭配各种衣服。用程序模拟这个装扮的过程。

    UML图:

    装饰模式示例UML图.png

    代码实现:

    People类,ConcreteComponent

    public class People extends Component{
    
        public People(){}
        private String name;
    
        public People(String name) {
            this.name = name;
        }
    
        @Override
        public void operation() {
            System.out.println("装饰的是"+name);
        }
    }
    

    服饰类 Decorator

    public class Finery extends People {
    
        protected People component;
        
        //打扮
        public void Decorate(People component) {
            this.component = component;
        }
    
        @Override
        public void operation() {
            if (component!=null){
                component.operation();
            }
        }
    }
    

    具体服饰类-T恤 ConcrteFecorator

    public class TShirts extends Finery {
    
        @Override
        public void operation() {
            System.out.print("TShirts");
            super.operation();
        }
    }
    

    具体服饰类-垮裤 ConcrteFecorator

    public class BigTrouser extends Finery {
    
        @Override
        public void operation() {
            System.out.print("垮裤");
            super.operation();
        }
    }
    

    客户端代码

    public class Main {
        public static void main(String[] args){
            People xiaocheng = new People("小成");
            System.out.println("第一种装扮:");
            TShirts tShirts = new TShirts();
            BigTrouser bigTrouser = new BigTrouser();
    
            tShirts.Decorate(xiaocheng);
            bigTrouser.Decorate(tShirts);
            bigTrouser.operation();
    
        }
    }
    

    运行结果

    第一种装扮:
    垮裤TShirts装饰的是小成
    

    相关文章

      网友评论

        本文标题:装饰模式

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