装饰者模式案例

Posted 前进道路上的程序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰者模式案例相关的知识,希望对你有一定的参考价值。

前言

装饰者模式是指在不改变原有对象的基础上,将功能附加在对象上,提供了比继承者更有弹性方案。

案例

在现实生活中,我们买车一般有基础配置、中配、高配等,在这里我们就可以应用装饰者模式来这种情况进行描述

创建车辆接口

首先我们创建一个车辆接口,里面有两个方法,分别用于获取描述信息以及价格
ICar

public interface ICar 
    public String getMsg();
    public int getPrice();

创建基础版车

NormalCard

public class NormalCard implements ICar

    @Override
    public String getMsg() 
        return "普通车";
    

    @Override
    public int getPrice() 
        return 100000;
    

创建装饰抽象类

CarDecorator :

public abstract class CarDecorator implements ICar
    private ICar iCar;
    public CarDecorator(ICar iCar) 
        this.iCar = iCar;
    
    public String getMsg() 
        return this.iCar.getMsg();
    
    public int getPrice() 
        return this.iCar.getPrice();
    

这个装饰抽象类实现了ICar接口,类中有一个iCar类型的私有变量,这个变量在构造时进行赋值。同时其实现的getMsg和getPrice都是调用构造时传进来的iCar的getMsg和getPrice

创建GPS装饰和座椅装饰

GPSCarDecorstor :

public class GPSCarDecorstor extends CarDecorator
    public GPSCarDecorstor(ICar iCar) 
        super(iCar);
    

    public String getMsg() 
        return super.getMsg()+"+GPS导航";
    

    public int getPrice() 
        return super.getPrice()+1500;
    

SeatCarDecorstor :

public class SeatCarDecorstor extends CarDecorator
    public SeatCarDecorstor(ICar iCar) 
        super(iCar);
    

    public String getMsg() 
        return super.getMsg()+"+豪华座椅";
    

    public int getPrice() 
        return super.getPrice()+10000;
    

可以看到,这两种装饰类继承了CarDecorator抽象类,并且重写了相应的getMsg和getPrice,在父类方法上进行了装饰

测试

public class Test 
    public static void main(String[] args) 
        ICar car = new NormalCard();
        car = new GPSCarDecorstor(car);
        car = new SeatCarDecorstor(car);
        System.out.println(car.getMsg()+",价格:【"+car.getPrice()+"】元");
    

相应的类图如下:

以上是关于装饰者模式案例的主要内容,如果未能解决你的问题,请参考以下文章

装饰者模式案例

抽丝剥茧——装饰者设计模式

设计模式------装饰者设计模式(案例补充)

从“汽车制造”生活案例到软件的建造者模式

4.装饰者模式

结构型模式-装饰者模式