zoukankan      html  css  js  c++  java
  • 《大话设计模式》--装饰者模式

    题目:给一个人“小王”搭配衣服和裤子

    public abstract class Component {
        public abstract void operation();
    }
    public class ConcreteComponent extends Component {
        @Override
        public void operation() {
            System.out.println("具体对象的操作");
        }
    }
    public abstract class Decorator extends Component {
    
        protected Component component;
    
        public void setComponent(Component component) {
            this.component = component;
        }
    
        @Override
        public void operation() {
            if (component != null) {
                component.operation();
            }
        }
    }
    public class ConcreteDecoratorA extends Decorator {
        private String addedState;
    
        @Override
        public void operation() {
            super.operation();
            addedState = "New State";
            System.out.println("具体装饰对象A的操作");
        }
    }
    public class ConcreteDecoratorB extends Decorator {
        @Override
        public void operation() {
            super.operation();
            addBehavior();
            System.out.println("具体装饰对象B的操作");
        }
    
        private void addBehavior() {
    
        }
    }
    public class Wear {
        public static void main(String args[]){
            ConcreteComponent c = new ConcreteComponent();
            ConcreteDecoratorA d1 = new ConcreteDecoratorA();
            ConcreteDecoratorB d2 = new ConcreteDecoratorB();
            d1.setComponent(c);
            d2.setComponent(d1);
            d2.operation();
        }
    }

    特别注意这段

            d1.setComponent(c);
            d2.setComponent(d1);
            d2.operation();

    一层套一层,代表功能的拓展

    装饰者模式是利用setComponent进行包装的

    另外,如果只有一个ConcreteComponent类而没有抽象的Component类,那Decorator类可以是ConcreteComponent的一个子类。

    如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类。

    public class Person {
        private String name;
    
        public Person() {
        }
    
        public Person(String name) {
            this.name = name;
        }
    
        public void show() {
            System.out.println("装扮的" + name);
        }
    }
    public class Decorator extends Person {
    
        protected Person component;
    
        public void Decorator(Person component) {
            this.component = component;
        }
    
        @Override
        public void show() {
            if (component != null) {
                component.show();
            }
        }
    }
    public class TShirt extends Decorator {
    
        @Override
        public void show() {
            System.out.println("大T恤");
            super.show();
        }
    }
    public class BigTrouser extends Decorator {
    
        @Override
        public void show() {
            System.out.println("垮裤");
            super.show();
        }
    }
    public class Wear {
        public static void main(String args[]) {
            Person person = new Person("小王");
            TShirt tShirt = new TShirt();
            BigTrouser bigTrouser = new BigTrouser();
    
            tShirt.Decorator(person);
            bigTrouser.Decorator(tShirt);
            bigTrouser.show();
        }
    }

     tShirt.Decorator(person);

    bigTrouser.Decorator(tShirt);

    bigTrouser.show();

    就是装饰过程

  • 相关阅读:
    HDU 4436 str2int (后缀自动机SAM,多串建立)
    HDU 4498 Function Curve (自适应simpson)
    PHP实现微信商户支付企业付款到零钱功能代码实例
    微信支付现金红包接口应用实例代码说明和DEMO详解,适合用来做微信红包营销活动、吸粉利器
    java开发学生信息管理系统的实现(简洁易懂),适合计算机专业学生参考,课程设计、毕业论文设计参考等
    公司注册经营范围大全
    《胡雪岩》影评10篇
    提高淘宝店铺动态评分的四大技巧
    为什么我的淘宝店铺动态评分清零了?
    CC攻击原理及防范方法和如何防范CC攻击
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/7412801.html
Copyright © 2011-2022 走看看