1、定義
訪問(wèn)者模式:在不改變數(shù)據(jù)結(jié)構(gòu)的前提下,增加作用于一組元素對(duì)象新功能
寫(xiě)法
/**
* 受訪者
*/
public interface IAccept {
void accept(IVisitor visit);
void showInfo();
}
/**
* 訪問(wèn)者
*/
public interface IVisitor<ACCEPT extends IAccept> {
void visit(ACCEPT accept);
Kind kind(); //訪問(wèn)者類型
}
/**
* 訪問(wèn)者類型
*/
public enum Kind {
CEO,
CTO,
HR
}
/**
* 訪問(wèn)者模板
*/
public abstract class Visitor implements IVisitor{
@Override
public void visit(IAccept accept) {
accept.showInfo();
}
}
public class CEOVisitor extends Visitor{
@Override
public Kind kind() {
return Kind.CEO;
}
}
public class CTOVisitor extends Visitor {
@Override
public Kind kind() {
return Kind.CTO;
}
}
/**
* 訪問(wèn)者
*/
public class HRVisitor extends Visitor{
@Override
public Kind kind() {
return Kind.HR;
}
}
/**
* 受訪者--工程師
*/
public class Engineer implements IAccept {
private String name;
private String kpi;
private String line;
private IVisitor visitor;
public Engineer(String name, String kpi, String line) {
this.name = name;
this.kpi = kpi;
this.line = line;
}
@Override
public void accept(IVisitor visit) {
visitor = visit;
visit.visit( this );
}
@Override
public void showInfo() {
if (visitor.kind() == Kind.CEO){
System.out.println( "Engineer{" +
"name='" + name + '\'' +
", kpi='" + kpi + '\'' +
'}' );
}else if(visitor.kind() == Kind.CTO){
System.out.println( "Engineer{" +
"name='" + name + '\'' +
", line='" + line + '\'' +
'}' );
}else if(visitor.kind() == Kind.HR){
System.out.println( "Engineer{" +
"name='" + name + '\'' +
'}' );
}
}
}
/**
* 受訪者--經(jīng)理
*
*/
public class Manage implements IAccept{
private String name;
private String kpi;
private String product;
private IVisitor visitor;
public Manage(String name, String kpi, String product) {
this.name = name;
this.kpi = kpi;
this.product = product;
}
@Override
public void accept(IVisitor visit) {
visitor = visit;
visit.visit( this );
}
@Override
public void showInfo() {
if (visitor.kind() == Kind.CEO){
System.out.println( "Manage{" +
"name='" + name + '\'' +
", kpi='" + kpi + '\'' +
", product='" + product + '\'' +
'}' );
}else if(visitor.kind() == Kind.CTO){
System.out.println( "Manage{" +
"name='" + name + '\'' +
", product='" + product + '\'' +
'}' );
}else if(visitor.kind() == Kind.HR){
System.out.println( "Manage{" +
"name='" + name + '\'' +
'}' );
}
}
}
public class Company {
private List<IAccept> acceptList = new ArrayList<>( );
public Company(){
acceptList.add( new Engineer( "小明","14","1000" ) );
acceptList.add( new Engineer( "小張","10","12300" ) );
acceptList.add( new Engineer( "小李","19","100450" ) );
acceptList.add( new Engineer( "小孫","16","101100" ) );
acceptList.add( new Manage( "張總","20","花錢項(xiàng)目" ) );
acceptList.add( new Manage( "馬云","10","五福項(xiàng)目" ) );
acceptList.add( new Manage( "王總","20","賣大米項(xiàng)目" ) );
acceptList.add( new Manage( "陳總","20","到天亮項(xiàng)目" ) );
}
public void showReport(IVisitor visitor){
for (IAccept accept :acceptList){
accept.accept( visitor );
}
}
}
/**
* 訪問(wèn)者模式
*
*/
public class TestMain {
public static void main(String[] args){
//公司
Company company = new Company();
//訪問(wèn)者查看對(duì)應(yīng)報(bào)告
company.showReport( new CEOVisitor() );
company.showReport( new HRVisitor() );
company.showReport( new CTOVisitor() );
}
}