结构型模式——装饰者模式
装饰者模式概述
指在不改变现有对象结构的情况下,动态地给改对象增加一些职责的结构性模式。
装饰者模式结构
装饰者模式包括:
- 抽象构件角色:定义一个抽象接口以规范准备接收附加责任的对象。
- 具体构件角色:实现抽象构件,通过装饰角色为其添加一些职责。
- 抽象装饰角色:继承或实现抽象构件,并包含具体构件的实例,可以通过其子类口站
- 具体装饰角色
装饰者模式实现
装饰者模式中各个角色的关系是这样的:“抽象构件角色”是整个装饰者模式中基础,这个“抽象构件角色”被很多“具体构件角色”继承。装饰类都是在“具体构件角色”的基础上进行装饰的。“抽象装饰角色”是整个装饰者模式中的核心类,他继承“抽象构件角色”,又聚合“抽象构件角色”,在“抽象装饰角色”被很多“具体装饰角色“继承,这些“具体装饰角色”在构件是会传入“抽象构件角色”的子类,并对其进行修改。
/**
* FastFood是抽象构件角色
*/
public abstract class FastFood {
private float price;
private String desc;
public FastFood() {
}
public FastFood(float price, String desc) {
this.price = price;
this.desc = desc;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public abstract float cost();
}
/**
* FiredNoodles、FriedRice是具体构件角色
*/
public class FiredNoodles extends FastFood{
public FiredNoodles(){
super(12,"炒面");
}
@Override
public float cost() {
return getPrice();
}
}
public class FriedRice extends FastFood{
public FriedRice(){
super(10,"炒饭");
}
@Override
public float cost() {
return getPrice();
}
}
/**
* Garnish睡觉是抽象装饰角色,也是装饰者模式的核心
*/
public abstract class Garnish extends FastFood{
private FastFood fastFood;
public FastFood getFastFood(){
return fastFood;
}
public void setFastFood(FastFood fastFood) {
this.fastFood = fastFood;
}
public Garnish(FastFood fastFood,float price,String desc){
super(price,desc);
this.fastFood = fastFood;
}
}
/**
* egg、bacon是具体装饰角色
*/
public class Egg extends Garnish{
public Egg(FastFood fastFood){
super(fastFood,1,"鸡蛋");
}
public float cost(){
return getPrice()+ getFastFood().cost();
}
@Override
public String getDesc() {
return super.getDesc()+getFastFood().getDesc();
}
}
public class Bacon extends Garnish{
public Bacon(FastFood fastFood){
super(fastFood,2,"培根");
}
@Override
public float cost() {
return getPrice() + getFastFood().cost();
}
@Override
public String getDesc(){
return super.getDesc()+getFastFood().getDesc();
}
}
代理模式和装饰者模式模式的相同点与不同点
相同点:
- 静态代理模式和装饰者模式核心类都要实现目标类的业务接口,
- 同时都需在核心类中声明目标对象。
- 都可以在不改变目标类的前提下增强目标方法。
不同点: - 目的不同,静态代理模式是为了增强目标对象,静态代理是为了保护和隐藏目标对象。
- 获取目标对象构件的地方不同,装饰者是由外界传递进来,静态代理是在核心类的内部创建。也就是说,虽然都要声明目标对象,但是静态代理在类的内部直接将目标对象new出来,而装饰者模式有外部业务代码传入目标对象,并将其进行修改。
文章内容为个人学习总结,如有错误望指正。
参考链接https://www.bilibili.com/video/BV1Np4y1z7BU