設計模式學習----裝飾模式

類型:結構模式

 

動態的對一個對象進行功能上的擴展,也可以對其子類進行功能上的擴展。

 

uml圖

 


package car_package;
public abstract class car_parent {
    // 汽車抽象父類
    private String make_address;
    private int speed;
    public String getMake_address() {
        return make_address;
    }
    public void setMake_address(String make_address) {
        this.make_address = make_address;
    }
    public int getSpeed() {
        return speed;
    }
    public void setSpeed(int speed) {
        this.speed = speed;
    }
    public abstract void print_face();
}

 

 

然後新建一個奧迪汽車子類

 

package car_package;
public class audi_sub extends car_parent {
    // 奧迪汽車子類
    @Override
    public void print_face() {
        System.out.println("audi車默認的顏色爲 黑色");
    }
}

 

然後再新建一個裝飾者父類:

 

package decorator_package;
import car_package.car_parent;
public abstract class decorator_parent extends car_parent {
    // 裝飾者父類
    protected car_parent car_parent_ref;
    public void setCar_parent_ref(car_parent car_parent_ref) {
        this.car_parent_ref = car_parent_ref;
    }
    @Override
    public void print_face() {
        car_parent_ref.print_face();
    }
}

 

然後再新建裝飾者子類:紅色火焰裝飾者類:

 

package decorator_package;
public class decorator_audi_red extends decorator_parent {
    @Override
    public void print_face() {
        super.print_face();
        System.out.println("給 奧迪 噴塗鴉 - 顏色爲 紅色火焰");
    }
}

 

然後再新建裝飾者子類:紫色霞光裝飾者類:

 

package decorator_package;
public class decorator_audi_purple extends decorator_parent {
    @Override
    public void print_face() {
        super.print_face();
        System.out.println("給 奧迪 噴塗鴉 - 顏色爲 紫色霞光");
    }
}

 

新建一個運行類

 

package main_run;

import car_package.audi_sub;
import decorator_package.decorator_audi_purple;
import decorator_package.decorator_audi_red;

public class main_run {

    public static void main(String[] args) {

        audi_sub audi_sub_ref = new audi_sub();
        audi_sub_ref.setMake_address("北京市朝陽區");
        audi_sub_ref.setSpeed(200);

        decorator_audi_red decorator_audi_red_ref = new decorator_audi_red();
        decorator_audi_red_ref.setCar_parent_ref(audi_sub_ref);

        decorator_audi_purple decorator_audi_purple_ref = new decorator_audi_purple();
        decorator_audi_purple_ref.setCar_parent_ref(decorator_audi_red_ref);

        decorator_audi_purple_ref.print_face();
    }
}

 

package decorator;
public interface Component{
    public void setName(String aName);
    public String getName();
}

 

ConcreteComponent代碼:

package decorator;
public class ConcreteComponent implements Component{
    String name;
    public void setName(String aName){
       name = aName;
    }
    public String getName(){
       return name;
    }
}

 

Decorator代碼:

package decorator;
public class Decorator implements Component{
    private Component component;
    public Decorator(Component c){
       component = c;
    }
    public void setName(String aName){
       component.setName(aName);
    }
    public String getName(){
       return "Name :"+component.getName();
    }
}

 

Client代碼

package decorator;
public class Client {
    public static void main(String[] args){
       Component c= new ConcreteComponent();
        Component d = new Decorator(c);
       c.setName("Lili");
       System.out.println(c.getName());
       d.setName("Lili");
       System.out.println(d.getName());
    }
}

發佈了2 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章