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();
    }
}

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

原文地址:https://www.cnblogs.com/AmoryWang-JavaSunny/p/6557834.html