首页 > 编程语言 >09.(结构型模式)java设计模式之装饰器模式

09.(结构型模式)java设计模式之装饰器模式

时间:2023-01-08 19:55:19浏览次数:49  
标签:java BigDecimal getDescription 模式 装饰 bike return 设计模式 public

一、什么是装饰器模式

简介:

  • 也叫包装设计模式,属于结构型模式,它是作为现有的类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构。
  • 给对象增加功能,一般两种方式继承或关联组合,将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为来增强功能,这个就是装饰器模式,比继承模式更加灵活。

应用:

小滴课堂-老王,本来计划买跑车撩妹的,结果口袋没钱,改买自行车,为了显得突出,店家提供多种改装方案,加个大的喇叭、加个防爆胎等,经过装饰之后成为目的更明确的自行车,更能解决问题。像这种不断为对象添加装饰的模式就叫Decorator模式,Decorator指的是装饰物。

二、装饰器模式的实现方式

模式结构分析:

       ●  抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。

  ●  具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。

  ●  装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。

  ●  具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。

类关系图:

统一模型:

代码实现:

查看代码
/*
* 被装饰者的统一抽象
* */
public interface Bike {
    String getDescription();
    BigDecimal getPrice();
}
/*
*装饰器
* */
public   class BikeDecorator implements Bike {
    private  String description="我只是一个装饰器,啥都不表示,子类帮我传递";
    private Bike bike;

    public BikeDecorator(Bike bike){
        this.bike=bike;
    }

    @Override
    public String getDescription() {
        return bike.getDescription();
    }

    @Override
    public BigDecimal getPrice() {
        return bike.getPrice();
    }
}

/*
 * 具体的装饰器(大自行车)
 * */
public class BigBike implements Bike {
    @Override
    public String getDescription() {
        return "大自行车";
    }

    @Override
    public BigDecimal getPrice() {
        return new BigDecimal("200");
    }
}
/*
* 具体的装饰器(小自行车)
* */
public class SmallBike implements Bike{
    @Override
    public String getDescription() {
        return "小自行车";
    }

    @Override
    public BigDecimal getPrice() {
        return new BigDecimal("100");
    }
}

/*
* 具体的装饰者(防爆胎)
* */
public class RSCBikeDecorator extends BikeDecorator {
    private  String description="防爆胎";

    public RSCBikeDecorator(Bike bike){
        super(bike);
    }
    @Override
    public String getDescription() {
        return super.getDescription()+"__"+this.description;
    }

    @Override
    public BigDecimal getPrice() {
        return super.getPrice().add(new BigDecimal("100"));
    }
}
/*
 * 具体的装饰者(大喇叭)
 * */
public class SuonaBikeDecorator extends BikeDecorator {
    private String description="大喇叭";

    public SuonaBikeDecorator(Bike bike){
        super(bike);
    }

    @Override
    public String getDescription() {
        return super.getDescription()+"__"+this.description;
    }

    @Override
    public BigDecimal getPrice() {
        return super.getPrice().add(new BigDecimal("50"));
    }
}

测试用例:

/*水
 *大自行车200
 * *小自行车100
 * *防爆胎100
 * *喇叭50*/
@Test
public void decoratorDesign() {
    Bike bike = new BigBike();
   //搭配了个RSC防爆胎
    bike = new RSCBikeDecorator(bike);
    bike = new RSCBikeDecorator(bike);
    //搭配了一个喇叭
    bike = new SuonaBikeDecorator(bike);
    bike = new SuonaBikeDecorator(bike);
    System.out.println(bike.getDescription() + ",价格: " + bike.getPrice());
}

测试结果:

大自行车__防爆胎__防爆胎__大喇叭__大喇叭,价格: 500

方法评估:

装饰器模式和桥接模式对比:

  • 相同点都是通过封装其他对象达到设计的目的,和对象适配器也类似,有时也叫半装饰设计模式
  • 没有装饰者和被装饰者的主次区别,桥接和被桥接者是平等的,桥接可以互换,不用继承自同一个父类
    比如例子里面的,可以是Phone持有Color,也可以是Colnr去右Phone.
  • 桥接模式不用使用同一个接口;装饰模式用同一个接口装饰,接口在父类中定义

优点:

  • 装饰模式与继承关系的目的都是要扩展对象的功能,但装饰模式可以提供比继承更多的灵活性。
  • 使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合,原有代码无须改变,符合"开闭原则”

缺点:

  • 装饰模式增加了许多子类,如果过度使用会使程序变得很复杂(多层包装)
  • 增加系统的复杂度,加大学习与理解的难度

标签:java,BigDecimal,getDescription,模式,装饰,bike,return,设计模式,public
From: https://www.cnblogs.com/q994321263/p/16961854.html

相关文章

  • java代码的基本组成
    我们可以通过上一篇博客写的内容来分析java代码的组成java代码的组成我们可以大致分成4个部分一、标识符除了关键字(有颜色的,可以看到上方图片)以外,自己们写的单词(黑色部分......
  • java:跳跃——寻找路径
    题目描述小蓝在一个n行m列的方格图中玩一个游戏。开始时,小蓝站在方格图的左上角,即第1行第1列。小蓝可以在方格图上走动,走动时,如果当前在第r 行第 c 列,他不能走到行号......
  • JAVA 内部类
    内部类内部类就是在一个类的内部再定义一个类,比如A类中定义了一个B类,那么B类相对A类来说就称为内部类,而A类相对与B类来说就是外部类了。成员内部类静态内部类局部内部......
  • Java面试题笔记
    1Hystrix的状态有哪些closed->open:正常情况下熔断器为closed状态,当访问同一个接口次数超过设定阈值并且错误比例超过设置错误阈值的时候,就会打开熔断机制,这时候熔断......
  • JAVA 接口
    普通类:只有具体实现抽象类:具体实现和规范(抽象方法)都有!接口:只有规范!自己无法写方法~专业约束~约束和实现分离:面向接口编程~  接口就是规范,定义的是一组规则,体现了......
  • JavaWeb概述
    笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html)参考视频:黑马程序员新版JavaWeb基础教程,Javaweb从入门到企业实战完整版注意:javaWeb部分包含了前端和后......
  • 【Java】四种引用和引用队列的概念
    四种引用类型强引用(StrongReference)强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用:Objectobject=newObject();Stringstr=......
  • javascript 操作剪切板
    此库优点:支持电脑和手机端浏览器第一步:声明一个对象$(function(){varclipboard=newClipboardJS(document.getElementById("btnCopyFileShareLink"......
  • JAVA工程师学习教程之Set和HashMap集锦
    day14_JAVAOOP课程目标1.【理解】Set集合的特点2.【理解】Set集合不重复的原理3.【掌握】HaseSet集合的基本使用4.【理解】LinkedHashSet的特点5.【理解】Map集......
  • JAVAEE工程师零基础学习教程之泛型类和File类
    day15_JAVAOOP课程目标1.【理解】什么是泛型2.【掌握】泛型的基本使用3.【理解】什么是Collections工具类4.【理解】什么是File类5.【掌握】File类的常用功能6.......