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());
    }
}
 

 

 

 

 

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