设计模式(装饰者模式)(二)
l":
return 0.10+beverage.cost();
case "medium":
return 0.15+beverage.cost();
case "big":
return 0.20+beverage.cost();
default:
return 0.15+beverage.cost();
}
}
}
StarBuzzCoffee.java
[java]
public class StarBuzzCoffee{
public static void main(String args[]){
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription()+'$'+beverage.cost());
Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
beverage2.setSize("big");
beverage2 = new BeverageSize(beverage2);
System.out.println(beverage2.getDescription()+'$'+beverage2.cost());
Beverage beverage3 = new HouseBlend();
beverage3 = new Mocha(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
beverage3 = new BeverageSize(beverage3);
System.out.println(beverage3.getDescription()+'$'+beverage3.cost());
}
}
对应StarBuzzCoffee.java文件,里面的装饰类采用了很多new的方法,优化的方法就是使用工厂方法,所谓工厂也就是生产具体实例的地方;工厂方法有区别于抽象工厂。
有关抽象的概念,比如说抽象类和接口,抽象类里面的方法可以有具体的实现,但是抽象类里面可以有自己的具体实现的方法;而接口只能在其继承类的里面实现方法细节(必须实现)。两者共同的地方就是 继承的类有公共的 方法,既然有共同的方法,就提取出来,做成接口(抽象类)。
animals.java
[java]
interface animals {
public void bark();
}
cat.java
[java]
class cat implements animals {
public void bark() {
System.out.println("miao miao");
}
}
dog.java
[java]
class dog implements animals {
public void bark() {
System.out.println("wang wang");
}
}
test.java
[java]
public class test{
public static void main(String args[]) {
animals a = new dog();
a.bark();
}
}
dog,cat都有一个bark的方法,把这个方法提取出来作为一个接口声明。比如说电脑的打印机,电脑提供了USB接口,不论任何打印机只要实现了这个接口,就可以进行打印了,具体怎么实现的,那是打印机厂家的事情了。
如果现在需要cat的bark方法,那么只需要把animals a = new dog();改成 animals a = new cat();即可。如果是针对实现编程 ,那么就是 dog a = new dog(); cat a = new cat();