装饰类解释

本篇转载来源 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();
}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值