装饰器模式 java 414
2015-08-21 21:54
525 查看
混型与装饰者模式有些相近的感觉。
装饰者模式使用分层对象来动态的向某个对象中添加责任。自我理解是,先定义一个公共的类,这个类有其他类所有的基本方法。官方说法是,装饰器指定包装在最初的对象周围的所有对象都具有相同的基本接口,某些食物时刻装饰的,可以通过将其他类包装在这个可装饰对象的四周,来将功能分层。所以,对装饰器的使用是透明的,无论对象是否被装饰,你都拥有一个可以想对象发送的公共消息集,然后装饰类也可以添加新方法,但是这是受限的。
装饰器是通过组合和形式化结构来实现的,混形式基于继承的。可以将基于参数化的混型当做是一种反省装饰器机制,这种机制不需要装饰器设计模式的继承结构。
package test;
class Coffee {
private double price;
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Initial Coffee [price=" + price + "]";
}
}
class MilkCoffee extends Coffee {
private Coffee coffee;
public MilkCoffee(Coffee coffee) {
// TODO Auto-generated constructor stub
this.coffee = coffee;
}
public double getPrice() {
return coffee.getPrice();
}
public void setPrice(double price) {
coffee.setPrice(price);
}
}
class BubbleCoffee extends MilkCoffee {
private String bubble;
public BubbleCoffee(Coffee coffee) {
super(coffee);
bubble = "泡沫";
}
public String getBubble() {
return bubble;
}
}
class SugerCoffee extends MilkCoffee {
private String suger = "焦糖";
public SugerCoffee(Coffee coffee) {
super(coffee);
// TODO Auto-generated constructor stub
}
public String getSuger() {
return suger;
}
}
public class Main {
public static void main(String[] args) {
BubbleCoffee mc = new BubbleCoffee(new Coffee());
BubbleCoffee bc = new BubbleCoffee(new SugerCoffee(new Coffee()));
SugerCoffee sc = new SugerCoffee(new Coffee());
SugerCoffee sc1 = new SugerCoffee(new BubbleCoffee(new Coffee()));
//sc1.getBubble(); 错误,因为尽管可以添加多个层,但是只有最后一层才是实际的类型,因此只有最后一层的方法是可视的。
//此处即是说,虽然将BubbleCoffee套在了SugerCoffee里面,但是其实是不能调用他的方法的,只能调用BubbleCoffee的方法。
}
}
装饰者模式使用分层对象来动态的向某个对象中添加责任。自我理解是,先定义一个公共的类,这个类有其他类所有的基本方法。官方说法是,装饰器指定包装在最初的对象周围的所有对象都具有相同的基本接口,某些食物时刻装饰的,可以通过将其他类包装在这个可装饰对象的四周,来将功能分层。所以,对装饰器的使用是透明的,无论对象是否被装饰,你都拥有一个可以想对象发送的公共消息集,然后装饰类也可以添加新方法,但是这是受限的。
装饰器是通过组合和形式化结构来实现的,混形式基于继承的。可以将基于参数化的混型当做是一种反省装饰器机制,这种机制不需要装饰器设计模式的继承结构。
package test;
class Coffee {
private double price;
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Initial Coffee [price=" + price + "]";
}
}
class MilkCoffee extends Coffee {
private Coffee coffee;
public MilkCoffee(Coffee coffee) {
// TODO Auto-generated constructor stub
this.coffee = coffee;
}
public double getPrice() {
return coffee.getPrice();
}
public void setPrice(double price) {
coffee.setPrice(price);
}
}
class BubbleCoffee extends MilkCoffee {
private String bubble;
public BubbleCoffee(Coffee coffee) {
super(coffee);
bubble = "泡沫";
}
public String getBubble() {
return bubble;
}
}
class SugerCoffee extends MilkCoffee {
private String suger = "焦糖";
public SugerCoffee(Coffee coffee) {
super(coffee);
// TODO Auto-generated constructor stub
}
public String getSuger() {
return suger;
}
}
public class Main {
public static void main(String[] args) {
BubbleCoffee mc = new BubbleCoffee(new Coffee());
BubbleCoffee bc = new BubbleCoffee(new SugerCoffee(new Coffee()));
SugerCoffee sc = new SugerCoffee(new Coffee());
SugerCoffee sc1 = new SugerCoffee(new BubbleCoffee(new Coffee()));
//sc1.getBubble(); 错误,因为尽管可以添加多个层,但是只有最后一层才是实际的类型,因此只有最后一层的方法是可视的。
//此处即是说,虽然将BubbleCoffee套在了SugerCoffee里面,但是其实是不能调用他的方法的,只能调用BubbleCoffee的方法。
}
}
相关文章推荐
- eclipse无法导入工程文件
- JList的ListSelectionEvent的几个问题请教
- Java反射性能优化(上)
- java.lang.UnsatisfiedLinkError: Couldn't load libjniFramework from loader
- JAVA反射机制
- Java 泛型 详解
- 【leetcode】Isomorphic Strings【java】
- DesignPattern_Java:Factory Method Pattern
- java并发编程---如何创建线程以及Thread类的使用
- java中的移位运算符:<<,>>,>>>
- java基础之集合框架总结篇
- Java基础语法
- springmvc学习笔记(四)访问静态资源
- java命令模式
- java泛型方法
- Thinking in java 之'数据初始化'
- Java简单聊天室
- 从零开始学Java自己利用接口和集合框架做的简单图书管理系统
- 排序算法(Java语言)——归并排序
- java去除重复的字符串和移除不想要的字符串