装饰器模式

场景:对现有方法或类的增强,与代理模式不同的是,代理模式一般增强的是与原有的功能不相关的功能,比如流量统计

基于继承的装饰器模式

(1)定义接口

java 复制代码
/**
 * 策略模式:不同类型选择不同的实现策略
 * */
public interface AbstractStrategy {

    /**
     * 模版模式:不同策略实现同一接口的共性部分(公共方法)
     * */
    default void commentMeth(){
        System.out.println("模版方法");
    }

    void handle(Object object);
}

(2)被装饰者

java 复制代码
public class AchieveOneStrategy implements AbstractStrategy{
    @Override
    public void handle(Object obj) {
        System.out.println("hello world!");
    }
}

(3)抽象的装饰者

java 复制代码
public abstract class Decoration implements AbstractStrategy {

    AbstractStrategy abstractStrategy;

    Decoration(AbstractStrategy abstractStrategy){
        this.abstractStrategy = abstractStrategy;
    }
    public void handle(Object object) {
        abstractStrategy.handle(object);
    }

}

(4)具体的装饰者

java 复制代码
public class CustomDecoration extends Decoration{

    CustomDecoration(AbstractStrategy abstractStrategy){
        super(abstractStrategy);
    }
    @Override
    public void handle(Object object) {
        before();
        abstractStrategy.handle(object);
        after();
    }

    public void before(){
        System.out.println("ConcreteDecorator前置操作....");
    }

    /**
     * 具体组件动作执行后的装饰
     *
     * @author zdp
     * @date   2022/9/3 17:58
     */
    public void after(){
        System.out.println("ConcreteDecorator后置操作....");
    }

}

比如:线程安全的List装饰器

java 复制代码
public class SynchronizedCollections {
    static <T> List<T> synchronizedList(List<T> list){
        
       return new SynchronizedList<>(list);
       
    }
    static class SynchronizedList<T> implements List<T> {
        List<T> list;
        final Object obj  = new Object();

        SynchronizedList(List<T> list){
            this.list = list;
        }

        @Override
        public boolean add(T t) {
            synchronized (obj){
                return list.add(t);
            }
        }
        
        @Override
        public T get(int index) {
            synchronized (obj) {
                return list.get(index);
            }
        }
        
        ......
    }
}
相关推荐
代码萌新知5 天前
设计模式学习(五)装饰者模式、桥接模式、外观模式
java·学习·设计模式·桥接模式·装饰器模式·外观模式
笨手笨脚の7 天前
设计模式-装饰器模式
java·设计模式·装饰器模式·结构型设计模式
charlie11451419110 天前
精读C++20设计模式:结构型设计模式:装饰器模式
笔记·学习·设计模式·程序设计·c++20·装饰器模式
奔跑吧邓邓子14 天前
【C++实战㊹】解锁C++装饰器模式:实战与技巧全解析
c++·实战·装饰器模式
休息一下接着来14 天前
C++ 装饰器模式
c++·设计模式·装饰器模式
bkspiderx14 天前
C++设计模式之结构型模式:装饰器模式(Decorator)
c++·设计模式·装饰器模式
new_daimond1 个月前
设计模式-装饰器模式详解
设计模式·装饰器模式
九术沫1 个月前
装饰器模式在Spring中的案例
java·spring·装饰器模式
o0向阳而生0o1 个月前
102、23种设计模式之装饰器模式(11/23)
设计模式·装饰器模式
宁静致远20211 个月前
【C++设计模式】第五篇:装饰器模式
c++·设计模式·装饰器模式