• java装饰器模式


    一、原文地址:

    秒懂设计模式之装饰者模式(Decorator Pattern)_ShuSheng007的博客-CSDN博客

    二、定义

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

    三、使用场景

    1. 需要在运行时动态的给一个对象增加额外的职责时候
    2. 需要给一个现有的类增加职责,但是又不想通过继承的方式来实现的时候(应该优先使用组合而非继承),或者通过继承的方式不现实的时候(可能由于排列组合产生类爆炸的问题)。

    四、 UML图

    假设我们有一个原味咖啡的类 OriginalCoffee, 目前的需求就是要动态的给这个类的一些实例增加一些额外功能,此处就是动态的对某些咖啡制作过程增加新的流程,例如加奶,加糖,而有的咖啡却保持原味不变。

     首先我们有一个ICoffee接口,里面有一个制作咖啡的接口方法makeCoffee()。要进行装饰的类 OriginalCoffee装饰者基类CoffeeDecorator(一般为抽象类)实现了此接口。

    CoffeeDecorator类里面持有一个ICoffee引用,我们第一步会把要装饰那个原始对象赋值给这个引用,那样在装饰者类中才可以调用到那个被装饰的对象的方法。

    MilkDecoratorSugarDecorator 都继承至CoffeeDecorator, 都是具体的装饰者类。

    五、咖啡加奶加糖的例子具体实现

    第一步:先声明一个原始对象的接口

    1. public interface ICoffee {
    2. void makeCoffee();
    3. }

    第二步:构建我们的原始对象,此处为原味咖啡对象,它实现了ICoffee接口。

    1. public class OriginalCoffee implements ICoffee{
    2. @Override
    3. public void makeCoffee() {
    4. System.out.println("原味咖啡");
    5. }
    6. }

    第三步:构建装饰者抽象基类,它要实现与原始对象相同的接口ICoffee,其内部持有一个ICoffee类型的引用,用来接收被装饰的对象。

    1. public abstract class CoffeeDecorator implements ICoffee{
    2. private ICoffee coffee;
    3. public CoffeeDecorator(ICoffee coffee){
    4. this.coffee = coffee;
    5. }
    6. @Override
    7. public void makeCoffee() {
    8. coffee.makeCoffee();
    9. }
    10. }

    第四步:构建各种装饰者类,他们都继承至装饰者基类 CoffeeDecorator。此处生成了两个,一个是加奶的装饰者,另一个是加糖的装饰者。

    MilkDecorator

    1. package milk;
    2. public class MilkDecorator extends CoffeeDecorator{
    3. public MilkDecorator(ICoffee coffee) {
    4. super(coffee);
    5. }
    6. @Override
    7. public void makeCoffee() {
    8. super.makeCoffee();
    9. addMilk();
    10. }
    11. private void addMilk(){
    12. System.out.println("加奶");
    13. }
    14. }

    SugarDecorator

    1. public class SugarDecorator extends CoffeeDecorator{
    2. public SugarDecorator(ICoffee coffee) {
    3. super(coffee);
    4. }
    5. @Override
    6. public void makeCoffee() {
    7. super.makeCoffee();
    8. addSugar();
    9. }
    10. private void addSugar(){
    11. System.out.println("加糖");
    12. }
    13. }

    第五步:客户端使用

    1. public static void main(String[] args) {
    2. // 原味咖啡
    3. ICoffee coffee = new OriginalCoffee();
    4. coffee.makeCoffee();
    5. // 加奶的咖啡
    6. coffee = new MilkDecorator(coffee);
    7. coffee.makeCoffee();
    8. // 先加奶,后加糖的咖啡
    9. coffee = new SugarDecorator(coffee);
    10. coffee.makeCoffee();
    11. }

    可以从客户端调用代码看出,装饰者模式的精髓在于动态的给对象增减功能

    六、字符串处理的场景

    6.1 背景

  • 相关阅读:
    搜题公众号搭建流程
    内存取证入门第一题
    Hexo 主题开发之自定义模板
    Python(pyexiv2)修改照片(证件照)的拍摄日期
    深入解析Spring Boot的常用注解和组件(上)
    git reset soft mixed hard keep区别
    java计算机毕业设计河南口腔医疗机构线上服务系统MyBatis+系统+LW文档+源码+调试部署
    什么是继承和选择器的权重
    Python 字典排序
    集成随机惯性权重和差分变异操作的樽海鞘群算法-附代码
  • 原文地址:https://blog.csdn.net/qq_39208536/article/details/125614137