装饰器模式
装饰器模式中主要有两个角色:
- 装饰器;
- 被装饰的对象。
用老王买装备的例子来说,老王就是被装饰的对象,而衣服、裤子、帽子等就是装饰器。
装饰器和被装饰的对象有两个特点,也是装饰器模式的关键:
- 他们实现同一个接口;
- 装饰器中使用了被装饰的对象。
使用装饰器模式的几个关键点:
- 装饰器和被装饰类要实现同一个接口( 实际开发中也可能用继承 )。
- 装饰器中的方法可以调用被装饰对象提供的方法,以此实现功能累加的效果,例如,夹克装饰器和帽子装饰器中调用了
person.cost() + xx
实现累计消费金额的累加。
实例
public interface Person {
/**
* 计算累计消费
* @return
*/
public Double cost();
public void show();
}
/**
* 抽象的服饰装饰器
*/
public abstract class ClothesDecorator implements Person {
//装饰器中要使用被装饰器的对象,构造方法中传入
protected Person person;
public ClothesDecorator(Person person) {
this.person = person;
}
}
/**
* 被装饰的对象
*/
public class LaoWang implements Person{
@Override
public Double cost() {
return 0.0; //赤果果的时候累计消费为0
}
@Override
public void show() {
System.out.println("我是赤果果的老王");
}
}
public class Jacket extends ClothesDecorator {
public Jacket(Person person) {
super(person);
}
@Override
public void show() {
person.show();
System.out.println("穿上夹克,累计消费" + this.cost());
}
@Override
public Double cost() {
return person.cost() + 100; //夹克100元
}
}
public class Hat extends ClothesDecorator {
public Hat(Person person) {
super(person);
}
@Override
public void show() {
//执行已有功能
person.show();
//此处是附加的功能
System.out.println("戴上帽子,累计消费" + this.cost());
}
@Override
public Double cost() {
return person.cost() + 50; //帽子50元
}
}
单元测试:
import com.netease.learn.designPattern.decorator.Hat;
import com.netease.learn.designPattern.decorator.Jacket;
import com.netease.learn.designPattern.decorator.LaoWang;
import com.netease.learn.designPattern.decorator.Person;
import org.junit.Test;
public class DecoratorTest {
@Test
public void test1() {
Person laowang = new LaoWang();
//穿上夹克
laowang = new Jacket(laowang);
//戴上帽子
laowang = new Hat(laowang);
laowang.show();
System.out.println("买单,老王总共消费:" + laowang.cost());
}
}
网友评论