代码改变世界

设计模式——装饰模式(Decorator Pattern)

  雪夜&流星  阅读(216)  评论(0编辑  收藏  举报

  装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

  UML图:

  

  模型类:

  

Component类:
复制代码
package com.cnblog.clarck;

/**
 * 接口对象,可以动态的给对象添加职责
 * 
 * @author clarck
 * 
 */
public abstract class Component {
    public abstract void Operation();
}
复制代码

 

ConcreateComponent类:
复制代码
package com.cnblog.clarck;

/**
 * 具体的装饰对象,起到给Component添加职责
 * 
 * @author clarck
 * 
 */
public class ConcreateComponent extends Component {

    @Override
    public void Operation() {
        System.out.println("具体对象的操作");
    }

}
复制代码

 

Decorator类:
复制代码
package com.cnblog.clarck;

/**
 * 装饰抽象类,继承了Component,从外来类来扩展Component类的功能,
 * 但对于Component来说是不需要知道Decorator的存在的。
 * 
 * @author clarck
 * 
 */
public abstract class Decorator extends Component {
    protected Component mComponent;

    public void setComponent(Component component) {
        mComponent = component;
    }
    
    @Override
    public void Operation() {
        if (mComponent != null) {
            mComponent.Operation();
        }
    }

}
复制代码

ConcreateDecoratorA类:
复制代码
package com.cnblog.clarck;

/**
 * 具体的的装饰对象,起到给Component添加职责的作用
 * 
 * @author clarck
 * 
 */
public class ConcreateDecoratorA extends Decorator {
    private String addedState;

    @Override
    public void Operation() {
        super.Operation();
        addedState = "New State";
        System.out.println("具体装饰对象A的操作" + addedState);
    }

}
复制代码

 

ConcreateDecoratorB类:
复制代码
package com.cnblog.clarck;

/**
 * 具体的装饰类B
 * 
 * @author clarck
 * 
 */
public class ConcreateDecoratorB extends Decorator {

    @Override
    public void Operation() {
        super.Operation();
        addedBehaivor();
        System.out.println("具体装饰对象B");
    }

    private void addedBehaivor() { //用来区别ConcreateDecoratorA
        
    }
}
复制代码

 

测试类:
复制代码
package com.cnblog.clarck;

/**
 * 测试类
 * 
 * @author clarck
 * 
 */
public class Test {
    public static void main(String[] args) {
        ConcreateComponent component = new ConcreateComponent();
        ConcreateDecoratorA decoratorA = new ConcreateDecoratorA();
        ConcreateDecoratorB decoratorB = new ConcreateDecoratorB();

        decoratorA.setComponent(component);
        decoratorB.setComponent(decoratorA);
        decoratorB.Operation();
    }
}
复制代码

 

 

 

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示