浅析设计模式–(二)装饰者模式

装饰者模式:我们在程序中处理业务过程中会出现很多需求,人的欲望是无止境的,当你的程序写完了,需求又提出这里再增加一些功能,这种情况非常常见,比如,目前实现了查询账单的功能,在这基础上,又要增加账单排序的功能,过一段时间又要实现账单的优化功能。这样的需求不断,我们一种做法是继承,创建好多子类,这样会出现类过多类膨胀的。因此就 装饰者模式应运而生。

装饰者模式的核心是装饰者和被装饰者实现相同的接口(这个接口是被装饰者的接口),所有的装饰者都继承自一个抽象类,这个抽象类实现了被装饰者的接口,并维护了一个有参的构造方法和被装饰者接口的类型的属性,通过构造方法来实传入具体的被装饰者对象。装饰者在实现自己的方法中调用被装饰者的方法,达到装饰的目的。

举个例子:

建造的类

package com.test.decorator;

/**
 * 一个 建造的接口,拥有一个建造的方法,
 * @author liuds1
 * 这个接口是被装饰者的接口
 */
public interface Build {

    void build();
}

造房子的类

package com.test.decorator;
/**
 * 来造一个房子
 * @author liuds1
 * 实现Build接口的基础的功能
 */
public class BuildHouse implements Build {

    @Override
    public void build() {
        System.out.println(" building  house ......");
    }

}

房子造完了,我们新的需求又来了,我们目前不仅仅想造房子,张三还想先粉刷房子再装修房子,李四想要先装修房子再粉刷房子。为了满足他们的奇葩需求,我们来构造一个抽象类(装饰者类),这个类维护了一个protected 修饰的 实现Build接口的对象。 并开放一个含有Build 类型参数的构造方法,通过构造方法初始化 build 对象。并用抽象方法实现Build接口。

package com.test.decorator;
/**
 * 核心:
 * @author liuds1
 * 构造一个抽象的父类,所有的装饰者都继承该类。
 */
public abstract class AbstrBuildHouse implements Build {

    protected Build build ;

    public AbstrBuildHouse (Build build){
        this.build = build;
    }

    //这里由具体的装饰者类来实现
    @Override
    public abstract void build() ;

}

粉刷房子的类

package com.test.decorator;

public class BuildPaintHouse extends AbstrBuildHouse {

    public BuildPaintHouse(Build build) {
        super(build);
    }

    @Override
    public void build() {
        paint();
    //实现的时候需要调用基础的被装饰者类的方法,来完成被装饰者的功能
        build.build(); 
    }

    private void paint(){
        System.out.println(" paint houst ....");
    }
}

装修房子的类

package com.test.decorator;

public class DecoratHosue extends AbstrBuildHouse {

    public DecoratHosue(Build build) {
        super(build);
    }

    @Override
    public void build() {
        decorator();
    //实现的时候需要调用基础的被装饰者类的方法,来完成被装饰者的功能
        build.build();
    }

    private void decorator(){
        System.out.println(" decorator house....");
    }
}

来实现 张三的需求:造房子,粉刷,装修。

package com.test.decorator;

public class Test {

    public static void main(String[] args) {
    //被装饰者对象
        Build buildHouse = new  BuildHouse();
        //装饰者
        Build buildPaintHouse = new BuildPaintHouse(buildHouse);
        //装饰
        Build decoratHouse = new DecoratHosue(buildPaintHouse);
        decoratHouse.build();
    }
}

另一种装饰
来实现 李四的需求:造房子,装修,粉刷。

package com.test.decorator;

public class Test {

    public static void main(String[] args) {
        Build buildHouse = new  BuildHouse();
        System.out.println("----------华丽分隔-------------");
            Build decoratHouse = new DecoratHosue(buildHouse );
        Build buildPaintHouse = new BuildPaintHouse(decoratHouse );
        System.out.println("----------华丽分隔-------------");
        buildPaintHouse .build();
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值