设计模式

装饰器模式

2020-03-08  本文已影响0人  GeekerLou

装饰器模式

装饰器模式中主要有两个角色:

装饰器和被装饰的对象有两个特点,也是装饰器模式的关键:

使用装饰器模式的几个关键点:

实例

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

参考资料

  1. 代码仓库-装饰器模式
上一篇 下一篇

猜你喜欢

热点阅读