装饰着模式

装饰着模式涉及的角色

抽象构建角色:定义一个抽象接口,来规范准备附加功能的类
具体构件角色:将要被附加功能的类,实现抽象构件角色接口
抽象装饰者角色:持有对具体构件角色的引用并定义与抽象角色一致的接口
具体装饰角色:实现抽象装饰者角色,负责为具体构件添加额外的功能。

例如有如下场景,卖饮料,可以是酸梅汤,豆浆等。假如纯豆浆(soya)卖五元,现在有三种配料,鸡蛋,糖,黑豆,都可以组合,可以是鸡蛋+豆浆+黑豆,也可以是豆浆加黑豆,各种组合,假如说每一种做法都要写一个类的话,那得需要写很多,会造成类爆炸。
这时装饰者模式就派上用场,
1)因为所有方法的豆浆都属于饮料,所以我先设计一个被装饰的接口Drink类,后期可以定义卖豆浆,卖酸梅汤
2)SoyaBeanMilk 这是具体的被装饰着对象,属于被装饰着,后面的黑豆糖属于装饰着
3)定义一个黑豆、糖、豆浆的装饰着基类,所有类都继承于它,在里面设定各种方法,此场景下设计describe和cost两个方法
4)定义 EggDecorator,SugarDecorator,BlackBeanDecorator,属于具体的装饰着对象,继承与装饰者基类
5)test类,负责具体的操作

装饰者模式的实现

1)具体类

Drink 被装饰者对象的接口
SoyaBeanMilk.java 具体的被装饰者对象
EggDecorator 具体装饰者对象
SugarDecorator.java 具体装饰者对象
BlackBeanDecorator.java 具体装饰者对象
Decorator.java 装饰者基类
Test.java 测试
2)代码如下
被装饰者装饰的接口

public interface Drink_decorator {
    //饮料的描述信息
    public String description();
    //计算价格
    public float cost();
    }
//具体的被装饰者对象,豆浆是饮料,需要实现饮料的接口
public class SoyaBeanMilk implements Drink_decorator{

    @Override
    public String description() {
        // TODO Auto-generated method stub
        return "纯豆浆";
    }

    @Override
    public float cost() {
        // TODO Auto-generated method stub
        return 5f;
    }
}

装饰者基类,关联Drink

public  abstract class Decorator implements Drink_decorator{
    private Drink_decorator drink;//要装饰的对象
    public Decorator(Drink_decorator drink) {
        // TODO Auto-generated constructor stub
        this.drink=drink;
    }
    @Override
    public String description() {
        // TODO Auto-generated method stub
        return drink.description();
    }

    @Override
    public float cost() {
        // TODO Auto-generated method stub
        return drink.cost();
    }
}

具体的装饰者对象,黑豆

public class BlackBeanDecorator extends Decorator{

    public BlackBeanDecorator(Drink_decorator drink) {
        super(drink);
        // TODO Auto-generated constructor stub
    }

    @Override
    public String description() {
        // TODO Auto-generated method stub
        return super.description()+"黑豆";
    }

    @Override
    public float cost() {
        // TODO Auto-generated method stub
        return super.cost()+1f;
    }

}

具体的装饰者对象 鸡蛋

public class EggDecorator extends Decorator{

    public EggDecorator(Drink_decorator drink) {
        super(drink);
        // TODO Auto-generated constructor stub
    }

    @Override
    public String description() {
        // TODO Auto-generated method stub
        return super.description()+"鸡蛋";
    }

    @Override
    public float cost() {
        // TODO Auto-generated method stub
        return super.cost()+2f;
    }

}

具体的装饰着对象,糖的装饰者对象

public class SugarDecorator extends Decorator{

    public SugarDecorator(Drink_decorator drink) {
        super(drink);
        // TODO Auto-generated constructor stub
    }

    @Override
    public String description() {
        // TODO Auto-generated method stub
        return super.description()+"糖";
    }

    @Override
    public float cost() {
        // TODO Auto-generated method stub
        return super.cost()+0.5f;
    }
}

测试类

public class test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //生产一杯豆浆
        Drink_decorator soya=new SoyaBeanMilk();
        //在豆浆中加鸡蛋
        EggDecorator eggsoya=new EggDecorator(soya);
        //在加了鸡蛋的豆浆中加糖
        SugarDecorator sugar=new SugarDecorator(eggsoya);
        //在加了糖加了鸡蛋的豆浆中假如黑豆 
        BlackBeanDecorator blackBeanDecorator=new BlackBeanDecorator(sugar);

        //结账
        System.out.println("您点的是:"+blackBeanDecorator.description());
        System.out.println("您一共消费了多少钱:"+blackBeanDecorator.cost()+"元");
    }

}

结果

您点的是:纯豆浆鸡蛋糖黑豆
您一共消费了多少钱:8.5元
装饰模式可以动态地为一个对象添加额外的功能。该模式定义了一个装饰类,它包装了原始的对象,并提供了额外的功能。 在Java中,实现装饰模式的基本步骤如下: 1. 定义一个抽象组件类,它定义了原始对象和装饰对象的共同接口。 2. 定义一个具体组件类,它实现抽象组件类中定义的方法。 3. 定义一个抽象装饰类,它继承了抽象组件类,并且包含了一个抽象组件的引用。 4. 定义一个具体装饰类,它继承了抽象装饰类,并且实现了抽象组件类中定义的方法,同时还可以添加额外的功能。 5. 在客户端中,创建一个具体组件对象,然后可以用一个或多个装饰对象来包装它,从而动态地为它添加额外的功能。 例如,我们可以定义一个抽象组件类 Shape,它有一个方法 draw(),表示绘制图形。然后定义一个具体组件类 Rectangle,它实现了 Shape 中的 draw() 方法。接着定义一个抽象装饰类 ShapeDecorator,它继承了 Shape,同时包含了一个 Shape 对象的引用。最后定义一个具体装饰类 RedBorderDecorator,它继承了 ShapeDecorator,实现了 Shape 中的 draw() 方法,并且还添加了一个红色的边框。 客户端可以这样使用: ``` Shape rectangle = new Rectangle(); Shape redBorderRectangle = new RedBorderDecorator(new Rectangle()); rectangle.draw(); // 绘制矩形 redBorderRectangle.draw(); // 绘制带红色边框的矩形 ``` 通过装饰模式,我们可以动态地为一个对象添加新的功能,而不需要修改原始对象的代码。这使得代码更加灵活、可扩展和易维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值