1.首先新建一個Person接口(也就是一套規范和標準),該接口定義了一個run和一個eat方法,實現這個接口的所有非抽象類必須實現這兩個方法
public interface Person {
void run();
void eat();
}
2.新建一個Man類,讓該類實現Person接口,該類由于不是抽象類,所以必須重寫Person接口的所有未實現方法
public class Man implements Person {
@Override
public void run() {
System.out.println("男人大步走!!!"); //可以自定義該方法
}
@Override
public void eat() {
System.out.println("男人大口吃!!!");
}
}
3.新建一個Women類,讓該類實現Person接口,該類由于不是抽象類,所以必須重寫Person接口的所有未實現方法
public class Women implements Person{
@Override
public void run() {
System.out.println("女人小步走!!!");
}
@Override
public void eat() {
System.out.println("女人減肥不吃飯!!!");
}
}
4.新建一個超人類Superman,同樣需要實現Person接口以及實現Person接口未實現的方法,其中2(Man類)和3(Women類)為被裝飾類(被加強類),而4(Superman類)為用來加強2和3的的作用
public class Superman implements Person {
Person people; (依賴倒置原則:依賴抽象而不依賴具體) //定義一個默認的people對象,值為null,構造方法將會對其進行賦值,從而可以表示每一次被傳進來的對象
//該構造方法用于接收傳遞進來的對象,并將當前的對象設置為傳遞進來的對象,傳遞進來的對象從而擁有了Superman類里面的所有方法
public Superman(Person people) {
super();
this.people = people; //將當前的對象設置為傳遞進來的對象
}
@Override
public void run() {
System.out.println("超人會飛!!!");
}
@Override
public void eat() {
people.eat(); //如果依舊想使用傳遞進來的對象的原來的eat方法,只需要使用people.eat()這種做法調用
}
}
5.最后定義一個用于測試的Client類
public class Client {
public static void main(String[] args) {
//此處使用Superman類的有參構造方法新建一個superman對象,并且把新建的Man對象作為參數傳遞到Superman類里面去
Superman superman = new Superman(new Man());
superman.run(); //默認調用的run方法就是Superman里面的run方法
superman.eat(); //而此處調用的eat方法則為Man類里面的eat方法,原因是在Superman類里面該方法又進行了自定義,調用回了Man類里面的eat方法
Superman superman2 = new Superman(new Women()); //Women的結果跟Man同理
superman2.run();
superman2.eat();
}
}
輸出結果為:
超人會飛!!!
男人大口吃!!!
超人會飛!!!
女人減肥不吃飯!!!
總結:主要思路就是先使用接口定義一個規范,然后再新建需要被裝飾的對象,以及用于裝飾其他對象的裝飾者,這些對象均需要實現前面的規范接口,使用裝飾者新建一個對象,并且傳入需要被裝飾的對象,從而被裝飾者擁有了裝飾者的屬性,從而達到裝飾的目的。