本篇转载来源 http://blog.csdn.net/jason0539/article/details/22713711
一、
public class Decorator_Humburger_Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Humburger humburger=new ChickenBurger();
sop(humburger.getName()+" 价钱:"+humburger.getPrice());
Lettuce lettuce=new Lettuce(humburger);
sop(lettuce.getName()+" 价钱:"+lettuce.getPrice());
Chilli chilli=new Chilli(humburger);
sop(chilli.getName()+" 价钱:"+chilli.getPrice());
Chilli chilli2=new Chilli(lettuce);//Chilli chilli2=new Chilli(new Lettuce(new ChickenBurger()))
sop(chilli2.getName()+" 价钱:"+chilli2.getPrice());
}
public static void sop(Object obj){
System.out.println(obj);
}
}
//汉堡基类(被装饰者)
abstract class Humburger{
protected String name;
//public Humburger(){};
public String getName(){
return name;
}
public abstract double getPrice();
}
//鸡腿堡类(被装饰者的初始状态,有些自己的简单装饰)
class ChickenBurger extends Humburger{
public ChickenBurger(){
//super();
name="鸡腿堡"; //为什么这里不需要先定义name呢,因为父类里面已经定义了name,而且是protected(不是private),所以直接继承过来了。,然后再读第26行,将父类的name改为“鸡腿堡”
}
public double getPrice(){
return 10;
}
}
//配料的基类(装饰者,用来对汉堡进行多层装饰,每一层装饰增加一些配料)
abstract class Condiment extends Humburger{
public abstract String getName();
}
//生菜(装饰者的第一层)
class Lettuce extends Condiment{
Humburger humburger;
public Lettuce (Humburger humburger){
this.humburger=humburger;
}
public String getName(){
return humburger.getName()+" 加生菜";//这里humburger.getName()是ChickenBurger(鸡腿堡)调用父类的getName()(因为ChickenBurger继承Humburger:可以调用父类方法)
}
public double getPrice(){
return humburger.getPrice()+1.5;
}
}
//辣椒(装饰者的第二层)
class Chilli extends Condiment{
Humburger humburger;
public Chilli(Humburger humburger){
this.humburger=humburger;
}
public String getName(){
return humburger.getName()+" 加辣椒";
}
public double getPrice(){
return humburger.getPrice(); //辣椒是免费的
}
}
二、
public class DecoratorDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Human person=new Person();
Decorator decorator=new Decorator_two(new Decorator_first(new Decorator_zero(person)));
decorator.wearClothes();
decorator.walkToWhere();
}
}
interface Human{
public void wearClothes();
public void walkToWhere();
}
class Person implements Human{
public void wearClothes(){
System.out.println("穿什么呢..");
}
@Override
public void walkToWhere() {
// TODO Auto-generated method stub
System.out.println("去哪里找呢..");
}
}
abstract class Decorator implements Human{
private Human human;
public Decorator(Human human){
this.human=human;
}
public void wearClothes(){
human.wearClothes();
}
public void walkToWhere(){
human.walkToWhere();
}
}
class Decorator_zero extends Decorator{
public Decorator_zero(Human human){
super(human);
}
public void goHome(){
System.out.println("进房子...");
}
public void findMap(){
System.out.println("书房找找Map...");
}
public void wearClothes(){
super.wearClothes();
goHome();
}
public void walkToWhere(){
super.walkToWhere();
findMap();
}
}
class Decorator_first extends Decorator{
public Decorator_first(Human human){ //1.确定每次跳的时候传进来的human是谁。2.父类引用指向子类对象,子类重写有效,能调用父类方法
super(human);
}
public void goClothespress(){
System.out.println("去衣柜找找看...");
}
public void findPlaceOnMap(){
System.out.println("在Map上找找...");
}
public void wearClothes(){
super.wearClothes();
goClothespress();
}
public void walkToWhere(){
super.walkToWhere();
findPlaceOnMap();
}
}
class Decorator_two extends Decorator{
public Decorator_two(Human human){
super(human);
}
public void findClothes(){
System.out.println("找到一件D&G...");
}
public void findTheTarget(){
System.out.println("在Map上找到神秘花园和城堡..");
}
public void wearClothes(){
super.wearClothes();
findClothes();
}
public void walkToWhere(){
super.walkToWhere();
findTheTarget();
}
}