zoukankan      html  css  js  c++  java
  • DesignMode_DecoratorMode

    今天来讲讲这个装饰模式,这种模式 主要是可以动态的在已有的功能上添加新的功能,原理就是因为,这种模式将要添加的功能单独提出来形成一个单独的逻辑区,与将要被添加的主体进行分割开,然后主体那边也可以有一个实现类或者一个接口,进行交互主体的主要功能还是在主体内部,但是一些其他的装饰功能,或者易变多种的特性就单独分离出来,进行一个将主体进行封装的逻辑区,方便后面可以动态的添加各种功能,或者特性

    若主体的分类比较多,就可以用一个接口来实现装饰和具体实例主体的交互

    package decoratorMode;
    
    /*
     *  主要的元素,里面有要实现的功能
     * */
    
    public interface BaseComponent {
        public void show();
    }

    具体的主体实例,当然你首先的满足是符合这个主体

    package decoratorMode;
    
    /*
     * 主要的元素的一个子类,因为他也有和父类一样的行为
     * */
    
    public class Person implements BaseComponent{ 
        private String name;
        public Person(String n) {
            this.name = n;
        }
        public void show(){
            System.out.println("今天这样穿的"+name);
        }
    }

    装饰的逻辑区, 这里是装饰主体,所以需要有主体的引用,但是并不需要主体知道有装饰的存在,而且也是装饰的主体的功能,这里是show()

    package decoratorMode;
    
    /*
     *  基础的装饰类,因为装饰有千变万化的特征,所以需要一个基类
     * */
    
    public class BaseDecorator implements BaseComponent{
        //这里的装饰是将需要的装饰的成分进行一个封装
        protected BaseComponent component;
        
        //进行封装de方法
        public void decorator(BaseComponent comp){ // 引用多态
            this.component = comp; //先得到需要封装的成分的引用,在这里可以动态的添加各种装饰
            
        }
        public void show(){
            if(component != null){ // 其实是具体被封装对象的展示
                component.show();
            }
        }
    }

    具体的装饰类

    package decoratorMode;
    
    /*
     * 具体的装饰类
     * */
    
    public class DecoratorPants extends BaseDecorator{
        private void wearPants(){
            System.out.println("穿裤子");
        }
        public void show(){
            wearPants();
            super.show();
        }
    }
    package decoratorMode;
    
    /*
     * 具体的装饰类
     * */
    
    public abstract class DecoratorHat extends BaseDecorator{
        private void wearHat(){
            System.out.println("戴帽子");
        }
        public void show(){
            wearHat();
            super.show();
        }
    }
    package decoratorMode;
    
    /*
     *具体装饰类 
     * */
    
    public class DecoratorTshirt extends BaseDecorator{
        // 具体装饰类,当然要有自己的独特的装饰,而且要尽量避免装饰类之间有重复的逻辑
        private void wearTshirt(){
            System.out.println("T-shirt");
        }
        // 开始要装饰
        public void show(){
            //装饰
            wearTshirt();
            super.show();
        }
    }

    具体的装饰类在主体的show的功能上可以动态添加一些其他的装饰功能,这就是装饰类想要达到的效果.

    package decoratorMode;
    
    /*客户端代码
     * */
    
    public class Client {
        public static void main(String[] args) {
            //现在客户端来装饰
            BaseComponent comp = new Person("小王");
            DecoratorTshirt T = new DecoratorTshirt();
            DecoratorPants pants = new DecoratorPants();
            T.decorator(comp); // 第一层装饰
            pants.decorator(T); // 第二层装饰
            pants.show();
        }
    }

    在这里要注意的是在有些情况下,装饰类的顺序是很重要的,还要保证装饰类的内容不要有所重叠....

  • 相关阅读:
    BUGFREE安装等
    常用网站
    Mongodb
    python资源
    HTTP协议详解(经典)
    Jmeter工具
    一.移动app测试与质量保证
    我发现涯哥特有才。各种跳,组合式
    原来如此
    我真庆幸我看过那本书。
  • 原文地址:https://www.cnblogs.com/AmoryWang-JavaSunny/p/6557834.html
Copyright © 2011-2022 走看看