小白谈谈装饰模式

概念

简单理解,装饰模式就是不断给一个物品或者一件事进行动态装饰,在不改变其结构的前提下,使其添加功能。

实现

举例:当我们有了一台车之后,每隔一段时间都会回去4S店进行保养的,当车子在4S店做完保养后,4S店都会给我们打印一个清单,表示所有在4S店的服务。假如我们不只是做保养,还需要给车加个大尾翼和换个颜色,那么用普通方式如下:

首先定义一个4S店基本服务的抽象类:

public abstract class FourS {

    //进行保养
    public abstract void unkeep();

    //向顾客罗列费用清单
    public abstract void list();
}

再定义4S店基本服务的具体实现:

public class BaseService extends FourS {

    //给车做保养
    @Override
    public void unkeep() {
        System.out.println("进行保养");
    }

    //向顾客罗列费用清单
    @Override
    public void list() {
        this.unkeep();
    }
}

顾客说我不止是做保养,还需要加个尾翼,换个颜色
那就是4S店的特殊服务了:

public class SpecialService extends BaseService{

    //给车换个颜色
    private void color(){
        System.out.println("给它换个颜色!");
    }

    //给车添加个装饰
    private void add(){
        System.out.println("给它添加个大尾翼!");
    }
	
	//因为保养是基本服务,所以无论添加任何其他服务都需要加入
    @Override
    public void list(){

        //把加尾翼的费用加到清单中
        this.add();
        //把加颜色的费用加到清单中
        this.color();
        //把保养的费用加到清单中
        super.unkeep();
    }
}

给顾客查看清单:

public class Customer {

    public static void main(String[] args) {
        FourS car = new SpecialService();

        //给顾客缠绵费用清单
        car.list();
    }
}

实验结果:
在这里插入图片描述
弊端:由此可见,通过继承实现装饰,不断添加,会导致类爆炸,类的数量激增,如果以后需要维护,不仅是工作量大,而且维护成本也很高。


装饰模式实现:
定义一个装饰的抽象类,用于封装4S店,代码如下:

public class Decorator extends FourS {

    //声明一个4S店
    private FourS fs;

    //构造函数,传递这个4s店过来
    public Decorator(FourS fs){
        this.fs = fs;
    }

    //4S店基本服务保养还是得做的
    public void unkeep(){
        this.fs.unkeep();
    }

    //还是需要给客户罗列清单的
    public void list(){
        this.fs.list();
    }
}

4S店实现一个更换颜色的服务:

public class ColorDecorator extends Decorator {
    public ColorDecorator(FourS fs) {
        super(fs);
    }

    //换个颜色
    private void color(){
        System.out.println("给车换个颜色!");
    }

    //给顾客罗列费用清单
    @Override
    public void list(){
        super.list();
        this.color();
    }
}

4S店实现一个添加部件的服务:

public class AddDecorator extends Decorator {

    //构造函数
    public AddDecorator(FourS fs) {
        super(fs);
    }

    //添加个大尾翼
    private void add(){
        System.out.println("添加个大尾翼!");
    }

    //重新打印清单
    @Override
    public void list(){
        super.list();
        this.add();
    }
}

顾客查看清单时:

public class Customer {

    public static void main(String[] args) {

        //找到一个4S店
        FourS fs;

        //4s店的基本服务
        fs = new BaseService();

        //给车换个色
        fs = new ColorDecorator(fs);

        //给车加个尾翼
        fs = new AddDecorator(fs);

        //给顾客缠绵费用清单
        fs.list();
    }
}

装饰模式还有一个非常好的优点,扩展性非常好,在一个项目中,你会有非常多因素考虑不到,特别是业务的变更,总会有新的需求的出现,如果使用该模式会很简便就给项目进行添加了,十分容易维护。


本文代码:https://pan.baidu.com/s/1aQWRkDYfMaobZe5hpabVXQ

提取码:ub0r

发布了48 篇原创文章 · 获赞 0 · 访问量 665

猜你喜欢

转载自blog.csdn.net/weixin_44943485/article/details/105215989
今日推荐