您现在的位置是:首页 >其他 >设计模式(十二)之装饰器模式网站首页其他

设计模式(十二)之装饰器模式

^“Liu”^ 2023-05-24 12:00:02
简介设计模式(十二)之装饰器模式

什么是装饰器模式

现在有一块蛋糕,涂上奶油就变成了奶油蛋糕,如果加上草莓就是草莓奶油蛋糕,再加上蜡烛就变成了生日蛋糕。
程序中的对象与蛋糕十分相似。将对象类比成蛋糕,不断的加功能对对象进行修饰,它就变成了更加明确的对象。像这样不断地为对象添加装饰的设计模式被称为(Decorator)装饰器模式

例子:

将原本只显示数字的类扩展成显示加减运算并展示结果的类

顶层接口:数字展示
NumberDisplay

package StructuralPattern.DecoratorMode;

/**
 * 顶层数字显示接口
 */

public interface NumberDisplay {
    void setTxt(int num);

    String getTxt();
}

核心实现类:展示数字
NumberShow

package StructuralPattern.DecoratorMode;

/**
 * 数字显示实现类
 */

public class NumberShow implements NumberDisplay{
    private int num;

    @Override
    public void setTxt(int num) {
        this.num = num;
    }

    @Override
    public String getTxt() {
        return String.valueOf(num);
    }
}

扩展装饰器抽象类,专门用于扩展的抽象类
ArithmeticDecorator

package StructuralPattern.DecoratorMode;

/**
 * 运算装饰器
 */

public abstract class ArithmeticDecorator implements NumberDisplay {

    protected NumberDisplay target;

    public ArithmeticDecorator(NumberDisplay target) {
        this.target = target;
    }

    public void setTxt(int num) {
        this.target.setTxt(num);
    }
}

加号装饰器
PlusDecorate

package StructuralPattern.DecoratorMode;

/**
 * 加号装饰器
 */

public class PlusDecorate extends ArithmeticDecorator {

    private int num;

    public PlusDecorate(NumberDisplay target,int num){
        super(target);
        this.num = num;
    }

    @Override
    public String getTxt() {
        return target.getTxt() + " + " + num;
    }
}

减号装饰器
MinusDecorate

package StructuralPattern.DecoratorMode;

/**
 * 减号装饰
 */

public class MinusDecorate extends ArithmeticDecorator {

    private int num;

    public MinusDecorate(NumberDisplay target,int num) {
        super(target);
        this.num = num;
    }

    @Override
    public String getTxt() {
        return target.getTxt() + " - " + num;
    }
}

等号装饰器
EquelDecorate

package StructuralPattern.DecoratorMode;

/**
 * 等号装饰
 */

public class EquelDecorate extends ArithmeticDecorator {
    private int num;

    public EquelDecorate(NumberDisplay target, int num) {
        super(target);
        this.num = num;
    }


    @Override
    public String getTxt() {
        return target.getTxt() + " = " + num;
    }
}

Main

package StructuralPattern.DecoratorMode;

/**
 * Main
 */

public class Main {
    public static void main(String[] args) {
    	// 只展示核心功能
        NumberDisplay display1 = new NumberShow();
        display1.setTxt(1);
        System.out.println(display1.getTxt());
		
		// 展示扩展功能
        NumberDisplay display2 = new PlusDecorate(display1,1);
        NumberDisplay display3 = new MinusDecorate(display2,2);
        NumberDisplay display4 = new EquelDecorate(display3,0);
        System.out.println(display4.getTxt());

		// 展示扩展功能
        NumberDisplay display = new EquelDecorate(new MinusDecorate(new PlusDecorate(new NumberShow(),2),4),0);
        display.setTxt(2);
        System.out.println(display.getTxt());
    }
}

结果
在这里插入图片描述

总结

从上边例子可以看出核心类NumberShow数字显示,并未发生改变,尽管被扩展了多次功能,但是核心接口api依旧可以使用。Decorator模式主要目的是通过添加装饰物来增加对象的功能,如果需要增加核心功能就在顶层接口增加方法,并增加顶层接口实现类的功能;对于附加接口,则通过抽象装饰器类去扩展。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。