这是这个星期刚学习的装饰模式,我来写写自己理解的装饰模式。
首先什么是装饰模式:装饰模式又称“包装器”,为什么说他是包装器呢,等下你看到我等会写的代码就知道了。装饰模式是在不需要改变原始代码的情况下,动态地扩展一个对象的功能。这是符合设计模式的基本原则之一:多扩展,少修改。
装饰模式包括那几部分呢?
装饰模式包括四部分:
1、抽象组件:是个抽象的类,里面定义了被装饰者的装饰方法。
2、具体组件:是抽象组件的子类,具体组件的实例被称为 被装饰者。
3、装饰:首先装饰也是抽象组件的一个子类,装饰里面包含一个抽象组件的一个成员变量用来保存“被装饰者的引用”,特别的是:装饰可以是个abstract的也可以是非abstract的,如果是非abstract的,那麽该类的实例被称为装饰者。
4、具体装饰:是装饰的子类,可以有多个,具体装饰的实例被称作装饰者。根据我自己的看法,每一个具体装饰,就是需要扩展的功能。
那麽装饰模式怎么用呢?
就根据食堂的非常常见的掉渣饼来说,饼是一个抽象组件,而掉渣饼就是饼的一个子类,具体实例。 装饰是什么呢,就是饼里面加的 烤肠,煎蛋,生菜等等一切可以加的东西,而这些加进去的东西就是装饰的具体实例,也就是子类。这样一说是不是有点内味了,懂了一点了。(我也是初识,你来看,我可能是以学生的视角来给你讲,就相当于倒数第一突然明白一点,来给倒数第二讲一下倒数第一的豁然开朗。)
接着说,刚才上面提到装饰者可以有很多个,就是对应这个些 烤肠、煎蛋、生菜来说的,每当你需要往里面加一点东西,就需要去创建一个子类来作为一个你所需要扩展的功能。
---------------------------------------------------------------到这里了,是否已经明白了一丢丢了--------------------------------------------------
接下来上代码:
下面是实现掉渣饼的价钱,加什么东西给什么价钱,在对象的基础上互相叠加使用功能,自由组合。
package DecoratorBing;
//抽象组件:Bing
public abstract class Bing {
public abstract double price(); //方法.
}
----------------------------------------------------------------------
package DecoratorBing;
//具体组件:也就是上面Bing的实例
public class DZBing extends Bing {
public final double PRICE=3.0;
@Override
public double price() { //父类具体方法实现。
// TODO Auto-generated method stub
return PRICE;
}
}
---------------------------------------------------------------------
package DecoratorBing;
//装饰者:也是Bing的子类。
public abstract class Decortor extends Bing{
Bing bing ;
public Decortor() {}
public Decortor(Bing bing) { //给成员变量赋值的
this.bing=bing ;
}
public double price() { //父类方法的实现
// TODO Auto-generated method stub
return 0;
}
}
-----------------------------------------------------------------------
package DecoratorBing;
//装饰者:装饰的子类,第一个功能加煎蛋
public class JianDan extends Decortor {
private final double PRICE=1.0;
public JianDan(Bing bing ) {
super(bing); //继承父类的方法
}
public double price() {
// TODO Auto-generated method stub
return bing.price()+Addprice();
}
private double Addprice() {
return PRICE;
}
}
--------------------------------------------------------------------------
package DecoratorBing;
//第二个子类,功能:加烤肠
public class KaoChang extends Decortor {
private final double PRICE=1.5;
public KaoChang(Bing bing) {
super(bing);
}
@Override
public double price() {
// TODO Auto-generated method stub
return bing.price()+Addprice();
}
public double Addprice() {
return PRICE;
}
}
----------------------------------------------------------------------------
package DecoratorBing;
//第三个子类,功能:加生菜
public class ShengCai extends Decortor {
private final double PRICE=0.5;
public ShengCai(Bing bing) {
super(bing);
}
@Override
public double price() {
// TODO Auto-generated method stub
return bing.price()+Addprice();
}
public double Addprice() {
return PRICE;
}
}
-----------------------------------------------------------------------
//Mai方法,来执行
package DecoratorBing;
public class APPlication {
public static void main(String[] args) {
Bing bing=new DZBing();//创建被装饰对象
//下面是功能实现,可以互相实现。
System.out.println("白饼子的价格"+bing.price());
Bing bing1=new JianDan(bing);
System.out.println("加煎蛋的价格"+bing1.price());
Bing bing2=new KaoChang(bing1);
System.out.println("加了煎蛋和烤肠的价格:"+bing2.price());
Bing bing3=new ShengCai(bing2);
System.out.println("加了烤肠煎蛋生菜的价格:"+bing3.price());
}
}
最后希望这篇文章能帮助初学的你,希望有帮助的话点个赞,有什么需要改正请你在下面评论,让我积极发现,改正,大家一起进步,你的指点,就是我进步的动力。