java 设计模式 装饰模式
2017-09-19 23:01
447 查看
装饰模式 有名包装模式
* 1.装饰模式以对客户端的方式扩展对象的功能,是继承关系的一个替代方案
* 2..装饰模式已对客户端的方式动态的给一个对象附加上更多的责任
* 3.装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展。
* 4.装饰模式把客户端的调用委派到被装饰类。装饰模式关键在于这种扩展是完全透明的
* 5.装饰模式是在不必改变原有文件和使用继承的情况下,动态的扩展一个对象的功能,他是通过创建一个包装对象来包裹真实对象
*
*
抽象构件角色(Component):给出一个抽象接口,以规范准备接收附加责任的对象。
具体构件角色(Concrete Component):定义一个将要接收附加责任的类。
装饰角色(Decorator):持有一个构件(Component)对象的引用,并定义一个与抽象构件接口一致的接口
具体装饰角色(Concrete Decorator):负责给构件对象“贴上”附加的责任。
*
* 装饰模式的特点:
装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
装饰对象包含一个真实对象的引用(reference)
装饰对象接收所有来自客户端的请求。它把这些请求转发给真实的对象。
装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
装饰模式 VS 继承
装饰模式
用来扩展特定对象的功能
不需要子类
动态
运行时分配职责
防止由于子类而导致的复杂和混乱
更多的灵活性
对于一个给定的对象,同时可能有不同的装饰对象,客户端可以通过它的需要选择合适的装饰对象发送消息。
继承
用来扩展一类对象的功能
需要子类
静态
编译时分派职责
导致很多子类产生
缺乏灵活性
Beverage饮料接口
[java] view
plain copy
/**
* 饮料接口
* @author Administrator
*
*/
public interface Beverage {
//返回商品描述
public String getDescription();
//返回价格
public double getPrice();
}
CoffeeBean1——具体被装饰的对象类1
[java] view
plain copy
public class CoffeeBean1 implements Beverage {
private String description = "选了第一种咖啡豆";
@Override
public String getDescription() {
return description;
}
@Override
public double getPrice() {
return 50;
}
}
CoffeeBean2——具体被装饰的对象类2
[java] view
plain copy
public class CoffeeBean2 implements Beverage {
private String description = "第二种咖啡豆!";
@Override
public String getDescription() {
return description;
}
@Override
public double getPrice() {
return 100;
}
}
Decorator——装饰类
[java] view
plain copy
public class Decorator implements Beverage {
private String description = "我只是装饰器,不知道具体的描述";
@Override
public String getDescription() {
return description;
}
@Override
public double getPrice() {
return 0; //价格由子类来决定
}
}
Milk——具体装饰类,给咖啡加入牛奶
[java] view
plain copy
public class Milk extends Decorator{
private String description = "加了牛奶!";
private Beverage beverage = null;
public Milk(Beverage beverage){
this.beverage = beverage;
}
public String getDescription(){
return beverage.getDescription()+"\n"+description;
}
public double getPrice(){
return beverage.getPrice()+20; //20表示牛奶的价格
}
}
Mocha——给咖啡加入摩卡
[java] view
plain copy
public class Mocha extends Decorator {
private String description = "加了摩卡!";
private Beverage beverage = null;
public Mocha(Beverage beverage){
this.beverage = beverage;
}
public String getDescription(){
return beverage.getDescription()+"\n"+description;
}
public double getPrice(){
return beverage.getPrice()+49; //30表示摩卡的价格
}
}
Soy——给咖啡加入豆浆
[java] view
plain copy
public class Soy extends Decorator {
private String description = "加了豆浆!";
private Beverage beverage = null;
public Soy(Beverage beverage){
this.beverage = beverage;
}
public String getDescription(){
return beverage.getDescription()+"\n"+description;
}
public double getPrice(){
return beverage.getPrice()+30; //30表示豆浆的价格
}
}
测试类:
[java] view
plain copy
public class Test {
public static void main(String[] args) {
Beverage beverage = new CoffeeBean1(); //选择了第一种咖啡豆磨制的咖啡
beverage = new Mocha(beverage); //为咖啡加了摩卡
beverage = new Milk(beverage);
System.out.println(beverage.getDescription()+"\n加了摩卡和牛奶的咖啡价格:"+beverage.getPrice());
}
}
测试结果:
* 1.装饰模式以对客户端的方式扩展对象的功能,是继承关系的一个替代方案
* 2..装饰模式已对客户端的方式动态的给一个对象附加上更多的责任
* 3.装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展。
* 4.装饰模式把客户端的调用委派到被装饰类。装饰模式关键在于这种扩展是完全透明的
* 5.装饰模式是在不必改变原有文件和使用继承的情况下,动态的扩展一个对象的功能,他是通过创建一个包装对象来包裹真实对象
*
*
抽象构件角色(Component):给出一个抽象接口,以规范准备接收附加责任的对象。
具体构件角色(Concrete Component):定义一个将要接收附加责任的类。
装饰角色(Decorator):持有一个构件(Component)对象的引用,并定义一个与抽象构件接口一致的接口
具体装饰角色(Concrete Decorator):负责给构件对象“贴上”附加的责任。
*
* 装饰模式的特点:
装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
装饰对象包含一个真实对象的引用(reference)
装饰对象接收所有来自客户端的请求。它把这些请求转发给真实的对象。
装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
装饰模式 VS 继承
装饰模式
用来扩展特定对象的功能
不需要子类
动态
运行时分配职责
防止由于子类而导致的复杂和混乱
更多的灵活性
对于一个给定的对象,同时可能有不同的装饰对象,客户端可以通过它的需要选择合适的装饰对象发送消息。
继承
用来扩展一类对象的功能
需要子类
静态
编译时分派职责
导致很多子类产生
缺乏灵活性
public interface Component { public void hangbao(); }
public class ConcreatComponent implements Component { public void hangbao() { // TODO Auto-generated method stub System.out.println("汉堡"); } }
public class concreatDecorator1 extends Decorator{ public concreatDecorator1(Component component) { super(component); // TODO Auto-generated constructor stub } @Override public void hangbao() { // TODO Auto-generated method stub super.hangbao(); jirouhangbao(); } public void jirouhangbao(){ System.out.println("+鸡肉"); } }
package Decorator; public class concreatDecorator2 extends Decorator{ public concreatDecorator2(Component component) { super(component); // TODO Auto-generated constructor stub } @Override public void hangbao() { // TODO Auto-generated method stub super.hangbao(); jirouhangbao(); } public void jirouhangbao(){ System.out.println("+加鸡蛋"); } }
public class Decorator implements Component{ Component component; public Decorator(Component component) { super(); this.component = component; } public void hangbao() { // TODO Auto-generated method stub component.hangbao(); } public static void main(String[] args){ Component co = new ConcreatComponent(); Decorator decorator = new concreatDecorator2(new concreatDecorator1(co)); decorator.hangbao(); } }
Beverage饮料接口
[java] view
plain copy
/**
* 饮料接口
* @author Administrator
*
*/
public interface Beverage {
//返回商品描述
public String getDescription();
//返回价格
public double getPrice();
}
CoffeeBean1——具体被装饰的对象类1
[java] view
plain copy
public class CoffeeBean1 implements Beverage {
private String description = "选了第一种咖啡豆";
@Override
public String getDescription() {
return description;
}
@Override
public double getPrice() {
return 50;
}
}
CoffeeBean2——具体被装饰的对象类2
[java] view
plain copy
public class CoffeeBean2 implements Beverage {
private String description = "第二种咖啡豆!";
@Override
public String getDescription() {
return description;
}
@Override
public double getPrice() {
return 100;
}
}
Decorator——装饰类
[java] view
plain copy
public class Decorator implements Beverage {
private String description = "我只是装饰器,不知道具体的描述";
@Override
public String getDescription() {
return description;
}
@Override
public double getPrice() {
return 0; //价格由子类来决定
}
}
Milk——具体装饰类,给咖啡加入牛奶
[java] view
plain copy
public class Milk extends Decorator{
private String description = "加了牛奶!";
private Beverage beverage = null;
public Milk(Beverage beverage){
this.beverage = beverage;
}
public String getDescription(){
return beverage.getDescription()+"\n"+description;
}
public double getPrice(){
return beverage.getPrice()+20; //20表示牛奶的价格
}
}
Mocha——给咖啡加入摩卡
[java] view
plain copy
public class Mocha extends Decorator {
private String description = "加了摩卡!";
private Beverage beverage = null;
public Mocha(Beverage beverage){
this.beverage = beverage;
}
public String getDescription(){
return beverage.getDescription()+"\n"+description;
}
public double getPrice(){
return beverage.getPrice()+49; //30表示摩卡的价格
}
}
Soy——给咖啡加入豆浆
[java] view
plain copy
public class Soy extends Decorator {
private String description = "加了豆浆!";
private Beverage beverage = null;
public Soy(Beverage beverage){
this.beverage = beverage;
}
public String getDescription(){
return beverage.getDescription()+"\n"+description;
}
public double getPrice(){
return beverage.getPrice()+30; //30表示豆浆的价格
}
}
测试类:
[java] view
plain copy
public class Test {
public static void main(String[] args) {
Beverage beverage = new CoffeeBean1(); //选择了第一种咖啡豆磨制的咖啡
beverage = new Mocha(beverage); //为咖啡加了摩卡
beverage = new Milk(beverage);
System.out.println(beverage.getDescription()+"\n加了摩卡和牛奶的咖啡价格:"+beverage.getPrice());
}
}
测试结果:
相关文章推荐
- Java语言实现的装饰设计模式复习
- java设计模式(1)-------单例,工厂,值对象,装饰模式
- java设计模式(六)---装饰器模式
- 黑马程序员:Java基础总结----装饰设计模式
- Java与设计模式(3)--装饰模式
- Java中设计模式——装饰类(传智播客毕老师视频讲解)
- Java 装饰设计模式
- Java设计模式之装饰模式
- JAVA开发的23种设计模式之 — 装饰器模式 && 代理器模式
- java设计模式之装饰模式代理模式区别
- java设计模式--装饰模式
- Java结构型设计模式-装饰(二)
- 读书笔记_java设计模式深入研究 第十一章 装饰器模式 Decorator
- Java与设计模式(十九)结构型--装饰器模式
- Java设计模式之装饰模式
- JAVA设计模式之装饰模式
- 【Java设计模式】之装饰模式
- (三)Java设计模式--装饰器模式
- JAVA 装饰类(装饰设计模式)
- java设计模式之装饰设计模式