当前位置:   article > 正文

[java] 23种设计模式之装饰者模式

[java] 23种设计模式之装饰者模式

1.1 装饰者模式的概念

​ 1、在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

​ 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。装饰对象可以在转发这些请求以前或以后增加一些附加功能

1.2 应用场景

比如我们去买一个肉夹馍,你可以选择加生菜、鸡蛋、鸡柳、香肠等等,一个肉夹馍加上不同的配料价格是不同的,那么我们如何去计算价钱呢?

   (1)抽象组件(Component)角色:给出一个抽象类,以规范准备接收附加功能的对象。

(2)具体组件(Concrete Component)角色:定义一个将要接收附加功能的类。
(3)装饰(Decorator)角色:持有一个组件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
(4)具体装饰(Concrete Decorator)角色:负责给组件对象添加上附加的功能。

1.3 肉夹馍实例

抽象组件(Component)角色:首先我们是定义一个抽象类ShouZhuaBingInterface,同时定义好基础的功能:

  1. public interface ShouZhuaBingInterface {
  2. /**
  3. * 描述
  4. *
  5. * @return
  6. */
  7. public String getDesc();
  8. /**
  9. * 手抓饼价格
  10. *
  11. * @return
  12. */
  13. public int getPrice();
  14. }

具体组件(Concrete Component)角色:定义一个被装饰的类,实现ShouZhuaBingInterface接口,并实现具体功能:

  1. public class ShouZhuaBing implements ShouZhuaBingInterface{
  2. @Override
  3. public String getDesc() {
  4. return "手抓饼";
  5. }
  6. @Override
  7. public int getPrice() {
  8. return 5;
  9. }
  10. }

装饰(Decorator)角色:定义一个装饰抽象类Deractor,实现ShouZhuaBingInterface接口,并拥有一个ShouZhuaBingInterface实例:

  1. public abstract class Deractor implements ShouZhuaBingInterface {
  2. private ShouZhuaBingInterface shouZhuaBingInterface;
  3. public Deractor(ShouZhuaBingInterface shouZhuaBingInterface) {
  4. this.shouZhuaBingInterface = shouZhuaBingInterface;
  5. }
  6. @Override
  7. public String getDesc() {
  8. return shouZhuaBingInterface.getDesc();
  9. }
  10. @Override
  11. public int getPrice() {
  12. return shouZhuaBingInterface.getPrice();
  13. }
  14. }

具体装饰(Concrete Decorator)角色:定义具体装饰类,继承装饰抽象类Deractor,并在其中扩展具体组件角色的功能:

鸡蛋装饰:

  1. public class EggDeractor extends Deractor {
  2. public EggDeractor(ShouZhuaBingInterface shouZhuaBingInterface) {
  3. super(shouZhuaBingInterface);
  4. }
  5. @Override
  6. public String getDesc() {
  7. String desc = "鸡蛋" + super.getDesc();
  8. return desc;
  9. }
  10. @Override
  11. public int getPrice() {
  12. int price = 2 + super.getPrice();
  13. return price;
  14. }
  15. }

香肠装饰:

  1. public class SausageDeractor extends Deractor {
  2. public SausageDeractor(ShouZhuaBingInterface shouZhuaBingInterface) {
  3. super(shouZhuaBingInterface);
  4. }
  5. @Override
  6. public String getDesc() {
  7. return "香肠" + super.getDesc();
  8. }
  9. @Override
  10. public int getPrice() {
  11. return 5 + super.getPrice();
  12. }
  13. }

现在我们可以测试一下 这个装饰者模式设计的代码有没有作用:

  1. public class DeractorTest {
  2. public static void main(String[] args) {
  3. ShouZhuaBingInterface shouZhuaBing = new ShouZhuaBing();
  4. System.out.println(shouZhuaBing.getDesc() + shouZhuaBing.getPrice());
  5. EggDeractor eggDeractor = new EggDeractor(shouZhuaBing);
  6. System.out.println(eggDeractor.getDesc() + eggDeractor.getPrice());
  7. SausageDeractor sausageDeractor = new SausageDeractor(shouZhuaBing);
  8. System.out.println(sausageDeractor.getDesc() + sausageDeractor.getPrice());
  9. SausageDeractor sausageDeractor1 = new SausageDeractor(eggDeractor);
  10. System.out.println(sausageDeractor1.getDesc() + sausageDeractor1.getPrice());
  11. }
  12. }

输出:

手抓饼5
鸡蛋手抓饼7
香肠手抓饼10
香肠鸡蛋手抓饼12

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/171978
推荐阅读
相关标签
  

闽ICP备14008679号