今天来讲讲这个装饰模式,这种模式 主要是可以动态的在已有的功能上添加新的功能,原理就是因为,这种模式将要添加的功能单独提出来形成一个单独的逻辑区,与将要被添加的主体进行分割开,然后主体那边也可以有一个实现类或者一个接口,进行交互主体的主要功能还是在主体内部,但是一些其他的装饰功能,或者易变多种的特性就单独分离出来,进行一个将主体进行封装的逻辑区,方便后面可以动态的添加各种功能,或者特性
若主体的分类比较多,就可以用一个接口来实现装饰和具体实例主体的交互
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(); } }
在这里要注意的是在有些情况下,装饰类的顺序是很重要的,还要保证装饰类的内容不要有所重叠....