Java設計模式之15——訪問模式

訪問模式是一種比較少用到的模式,但是一旦你使用訪問模式,往往你就真的需要使用訪問模式。訪問模式具有獨特的靈活性。

訪問模式是結構比較複雜的設計模式。

訪問模式,是封裝一些用於某種數據結構的各元素的操作, 它可以在不改變這些數據結構的前提下,定義作用於這些元素的新的操作。

1 創建訪問接口

package visitorpattern;

public interface Visitor {
    void visit(Engineer engineer);
    void visit(Manager manager);

}
 

2 創建被訪問對象

package visitorpattern;

import java.util.Random;

/**
 * 數據結構的抽象類
 * @author Administion
 *
 */
public abstract class Staff {
    public String name;
    public int kpi;
    
    public Staff(String name) {
        this.name = name;
        kpi = new Random().nextInt(10);
    }
    public abstract void accept(Visitor visitor);    
}
 

3 創建具體的被訪問實體類

 

創建Engineer類

package visitorpattern;

import java.util.Random;

public class Engineer extends Staff{

    public Engineer(String name) {
        super(name);
    }

    @Override
    public void accept(Visitor visitor) {

        visitor.visit(this);
    }

    public int getCodeLines(){
        return new Random().nextInt(10 * 10000);
        
    }
}
 

和 Manager類

package visitorpattern;

import java.util.Random;

public class Manager extends Staff{

    private int products;
    public Manager(String name) {
        super(name);
        products = new Random().nextInt(10);
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
        
    }
    public int getProducts(){
        return products;
    }

}
 

4 創建實體的訪問者

package visitorpattern;
/**
 * 操作數據
 */
public class CEOVisitor implements Visitor{

    @Override
    public void visit(Engineer engineer) {
        System.out.println("Engineer: "+engineer.getCodeLines()+"---KPI : "+engineer.kpi);
        
    }

    @Override
    public void visit(Manager manager) {
        System.out.println("Manager: "+manager.getProducts()+"---KPI : "+manager.kpi);
        
    }

}
 

5 創建對訪問數據的操作類,訪問過程不改變數據本身

package visitorpattern;

import java.util.ArrayList;
import java.util.List;

public class BusinessReport {

    private List<Staff> mStaff = new ArrayList<>();

    public BusinessReport( ) {
        mStaff.add(new Engineer("違法和"));
        mStaff.add(new Engineer("違紅人館和"));
        mStaff.add(new Engineer("戈貝爾"));
        mStaff.add(new Manager("未額頭"));
        
    }
    public void showReport(Visitor visitor) {
        for (Staff staff : mStaff) {
            staff.accept(visitor);
        }
    }    
}
 

5 測試訪問數據的結果

通過操作類訪問數據

package visitorpattern;

public class Client {

    public static void main(String[] args) {
        BusinessReport report = new BusinessReport();
        report.showReport(new CEOVisitor());
    }
}
 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章