设计原则
类应该对扩展开放,对修改关闭
设计原则用起来是很抽象不容易掌握,我先列出来让大脑形成一个意识,在编程的时候,去往这上边靠一靠,时间久了,也会有感觉的。对于高手来说,可能并没有设计模式这一说, 他们写的代码,不知觉的就有良好的设计。
学习一个东西,目的就是要让我们可以变的更好,学习设计模式也是一样的,首先我们要做的就是识别模式,这样用起来,也就轻而易举了。
1.认识
装饰者模式中有一个主体,可能有多个修饰主体的对象,比如我们常见的各种各样的奶茶,主体是奶茶,装饰者就是珍珠,波霸,柠檬汁等等,然后依赖委托就可以给各种奶茶制定价格了。
装饰者模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案
2.UML 类图
设计模式.png3.应用场景描述
我们来到一家咖啡馆,我们刚坐下,一位服务员迎上来,给我们递了一个咖啡种类的清单,上面有,浓缩(Espresso)咖啡,黑糖咖啡,黑糖牛奶咖啡,豆浆咖啡,摩卡豆浆拿铁咖啡,卡布奇诺等,还有么有写出来的,估计你想要什么样的咖啡,只要你告诉咖啡师,他们都能给你做出来,面对种类越来越多的咖啡,如果他们的老板找到你,想让你帮他们设计一个咖啡售卖的系统,价值20万,你会怎么设计呢?接下来我们就用装饰者模式,来进行设计
/其实还有很多的实例,在生活及工作中我们需要仔细的思考和观察,就会有所发现,识别出模式,然后使用模式,可以给自己的工作带来很高的效率,前提是一定要用对/
4.代码实现
- 1.创建一个抽象的主体的类
package com.pattern.decorator;
/**
* 基类
*/
public abstract class Beverage {
String description=" xxx beverate";
public String getDescription(){
return description;
}
public abstract double cost();
}
- 2.创建抽象的修饰类继承主体类
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
//所有的具体修饰者都必须重现实现 getDescription()方法,想想为什么?
}
- 3.实现主题类的具体类
/**
*
* 浓缩咖啡-实现主体的类
*/
public class Espresso extends Beverage {
public Espresso(){
description="Espresso";
}
@Override
public double cost() {
return 1.99;
}
}
第二个实现类
/**
* 牛奶咖啡-实现主体的类
*/
public class MilkCoffe extends Beverage {
public MilkCoffe(){
description="MilkCoffe";
}
@Override
public double cost() {
return 2.11;
}
}
- 4.实现修饰类的具体类,有几种修饰就可以写几种
/**
* 摩卡-具体的修饰类
*/
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage){
this.beverage=beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+",Mocha ";
}
//加了调料之后的咖啡价格
@Override
public double cost() {
return beverage.cost()+1;
}
}
/**
* 修饰类
*/
public class Sugar extends CondimentDecorator {
Beverage beverage;
public Sugar(Beverage beverage){
this.beverage=beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+", Sugar ";
}
@Override
public double cost() {
return beverage.cost()+5;
}
}
- 5.测试:供应饮料
public class StartbarkCoffee {
public static void main(String[] args) {
Beverage b1=new Espresso();//创建一个浓缩咖啡
//1.99
System.out.println(b1.getDescription()+" 售价:"+b1.cost());
Beverage b2=new MilkCoffe();//牛奶咖啡
//加入配料的咖啡
b2=new Mocha(b2);//用mocha 来修饰
b2=new Sugar(b2);//用糖来修饰
//预计结果是:2.11+1+5=8.11
System.out.println(b2.getDescription()+" 售价:"+b2.cost());
}
}
5.运行效果
Espresso 售价:1.99
MilkCoffe,Mocha , Sugar 售价:8.11
6.总结
装饰者模式:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案
7.扩展
记得有次去面试,面试官问我,你知道java 的I/O 中在创建流的时候,一般会嵌套几个,提高效率比如加入缓冲流,你知道这是用了什么设计模式吗?
当时我就是不知道,面试也没有成功,回来后默默的去查了一下,原来是装设折模式,突然就想起来,曾经知道过,但是当时为什么面试的时候没有想起来呢?其实是对知识掌握的不牢,也没有将知识形成知识晶体,存储在脑子里面是碎片化的记忆,很容易忘掉,在以后的学习过程要让知识形成强关系,这样才不会很容易的被遗忘,如果忘记了,还可以通过关系网想起来。谨记
网友评论