装饰模式

装饰模式(Decorator Pattern)

定义:Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。)

 

● Component抽象构件

Component是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象,如上面的成绩单。

注意:在装饰模式中,必然有一个最基本、最核心、最原始的接口或抽象类充当Component抽象构件。

● ConcreteComponent 具体构件

ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它。

● Decorator装饰角色

一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的属性里必然有一个private变量指向Component抽象构件。

● 具体装饰角色

ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类,你要把你最核心的、最原始的、最基本的东西装饰成其他东西,上面的例子就是把一个比较平庸的成绩单装饰成家长认可的成绩单。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。

使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

使用场景:

● 需要扩展一个类的功能,或给一个类增加附加功能。

● 需要动态地给一个对象增加功能,这些功能可以再动态地撤销。

● 需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。

实现

步骤 1

/*
抽象构件
 */
public interface Component {
    public void Computer();
}

步骤 2

import javax.swing.*;

/*
具体构件 创建原始对象
 */
public class ConcreteComponent  implements Component {
    @Override
    public void Computer() {
        System.out.println("电脑");
    }
}

步骤 3

/*
抽象装饰类
 */
public class Decorator implements Component{

    private  Component component;

    public Decorator(Component component) {
        this.component=component;
    }


    @Override
    public void Computer() {
        this.component.Computer();
    }
}

步骤 4

/*
具体装饰类 A(第一次装饰)
 */
public class ConcreteDecorarorA  extends Decorator{

    public ConcreteDecorarorA(Component component)
    {

         super(component);
    }

    public void Computer()
    {
        super.Computer();
        this.ComponentCPU();
    }

    public void ComponentCPU()
    {

        System.out.println("I5");
    }
}

步骤 5

/*
具体装饰类B(第二次装饰)
 */
public class ConcreteDecorarorB extends Decorator {

    public ConcreteDecorarorB(Component component)
    {

        super(component);
    }
    public void Computer()
    {
        super.Computer();
        this.ComponentMemory();
    }

    public void ComponentMemory()
    {

        System.out.println("8G");
    }
}

步骤 6 测试结果

/*
装饰者模式(Decorator Pattern)
 */
public class DecoratorPatternDescription {

    public static void main(String[] args) {
        //创建原始对象
        Component component = new ConcreteComponent();
        //第一次装饰
        component = new ConcreteDecorarorA(component);
        //第二次装饰
        component = new ConcreteDecorarorB(component);
        //两次装饰后的操作
        component.Computer();
    }

}

结果:

电脑
I5
8G

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值