Java中关于装饰者模式的几点想法

    装饰者模式,实现了一个对象可以添加很多方法的这种需求,并且调用的次序可以由最后代码修订的时候决定。这样就避免了重复的继承,减少了代码使用量,内存使用量。

    对于和我一样的初学者来说,装饰者模式可以分为几个模块:被装饰者,装饰者,具体装饰的类,装饰者初始的类。

     首先对于被装饰者,被装饰者一般来说是一个接口。就是因为接口,实现了很多的向上转型才完成了装饰者模式。

    package com.study.studydecorator02;


public interface Human {
//被装饰的 一般都是一个接口
public void eat();
public void wear();
}

  

    其次的话,就是装饰者。对于装饰者模式,装饰者是不可缺少的。一般来说,装饰者可以使用抽象类,这样的话,实现更多的功能,如果使用普通的类也可以。装饰者的代码一般就是调用被装饰者。

package com.study.studydecorator02;


public  class MyDecorator implements Human{
//装饰者 不一定是抽象类把
    Human human;
    public MyDecorator(Human human) {
// TODO Auto-generated constructor stub
    this.human=human;
}
@Override
public void eat() {
// TODO Auto-generated method stub
human.eat();
}
@Override
public void wear() {
// TODO Auto-generated method stub
human.wear();
}
}



    具体的装饰类,这种东西必须得有。具体装饰类才实现了一个对象可以使用多种方法。

 package com.study.studydecorator02;


public class Decorator01 extends MyDecorator{


public Decorator01(Human human) {
super(human);
// TODO Auto-generated constructor stub

}
@Override
public void eat() {
// TODO Auto-generated method stub
super.eat();
findFood();
}
   @Override
public void wear() {
// TODO Auto-generated method stub
super.wear();
findClose();
}
   
   public void findFood() {
System.out.println("寻找食物");
}
   public void findClose() {
System.out.println("寻找衣服,貌似衣服的单词写错了");
}
}





package com.study.studydecorator02;


public class Decorator02 extends MyDecorator{


public Decorator02(Human human) {
super(human);
// TODO Auto-generated constructor stub
}


@Override
public void eat() {
// TODO Auto-generated method stub
super.eat();
eatFood();
}


@Override
public void wear() {
// TODO Auto-generated method stub
super.wear();
wearClose();
}


public void eatFood() {
System.out.println("貌似吃到了好吃的了!");
}
public void wearClose() {
System.out.println("只穿了一个内裤哦");
}


}



    装饰初始类,一般来说,装饰者模式,都会有初始的方法。把具体装饰类中的方法贴到装饰初始类中就是装饰者模式了。

package com.study.studydecorator02;


public class Person implements Human{


@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("一大早醒来,想吃点东西哦");
}


@Override
public void wear() {
// TODO Auto-generated method stub
System.out.println("一大早醒来,得穿点衣服啊");
}


}



    测试类::

测试类的初始化是从外往内包装的。

package com.study.studydecorator02;


public class Test {
public static void main(String[] args) {
Human person=new Person();
        MyDecorator myDecorator=new Decorator02(new Decorator01(person));
myDecorator.eat();
myDecorator.wear();
}
}



运行结果

一大早醒来,想吃点东西哦
寻找食物
貌似吃到了好吃的了!
一大早醒来,得穿点衣服啊
寻找衣服,貌似衣服的单词写错了
只穿了一个内裤哦




你可能感兴趣的:(Java)