最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA設(shè)計(jì)模式之訪問(wèn)者模式原理與用法詳解

 更新時(shí)間:2017年08月04日 08:58:13   作者:遲做總比不做強(qiáng)  
這篇文章主要介紹了JAVA設(shè)計(jì)模式之訪問(wèn)者模式,簡(jiǎn)單說(shuō)明了訪問(wèn)者模式的原理,并結(jié)合實(shí)例分析了java訪問(wèn)者模式的定義與用法,需要的朋友可以參考下

本文實(shí)例講述了JAVA設(shè)計(jì)模式之訪問(wèn)者模式。分享給大家供大家參考,具體如下:

訪問(wèn)者模式:

一個(gè)作用于某對(duì)象結(jié)構(gòu)中各元素的操作,使你可以在不改變各元素類數(shù)據(jù)結(jié)構(gòu)的前提下增加作用于這些元素的新操作。

結(jié)構(gòu)對(duì)象是訪問(wèn)者模式必備條件,且這個(gè)結(jié)構(gòu)對(duì)象必須存在遍歷自身各個(gè)對(duì)象的方法。

適用于:數(shù)據(jù)結(jié)構(gòu)相對(duì)穩(wěn)定,把數(shù)據(jù)結(jié)構(gòu)和作用與其上的其它操作解耦,使得操作相對(duì)自由。

優(yōu)點(diǎn):

1、符合單一職責(zé)原則
2、擴(kuò)展性良好:元素類可以通過(guò)接受不同的訪問(wèn)者來(lái)實(shí)現(xiàn)對(duì)不同操作的擴(kuò)展。

缺點(diǎn):

1、如果要增加新元素,則會(huì)讓操作變得更復(fù)雜
2、在一定程序上破壞了封裝性原則

訪問(wèn)者械五大角色對(duì)象:

1.Visitor 抽象訪問(wèn)者角色
2.ConcreteVisitor.具體訪問(wèn)者角色
3.Element 接受訪問(wèn)操作元素
4.ConcreteElement 具體元素
5.ObjectStructure 結(jié)構(gòu)對(duì)象角色,這是使用訪問(wèn)者模式必備的角色。

/**
 * 抽象訪問(wèn)者:為該對(duì)象結(jié)構(gòu)中具體元素角色聲明一個(gè)訪問(wèn)操作接口。
 * 該操作接口的名字和參數(shù)標(biāo)識(shí)了發(fā)送訪問(wèn)請(qǐng)求給具體訪問(wèn)者的具體元素角色,
 * 這樣訪問(wèn)者就可以通過(guò)該元素角色的特定接口直接訪問(wèn)它。
 * @description:
 * @date 2016-1-15 下午4:00:29
 */
public interface Visitor {
  void visit(Element element);
}

/**
 * 具體訪問(wèn)者角色,實(shí)現(xiàn)Visitor聲明的接口。
 * @description:
 * @date 2016-1-15 下午4:20:46
 */
public class ConcreteVisitor implements Visitor{
  @Override
  public void visit(Element element) {
    Staff e=(Staff) element;
    //比如:加薪的計(jì)算方式:職位*加薪系數(shù)+工齡*對(duì)應(yīng)系統(tǒng)之和 除以10 再乘以現(xiàn)在工資
    System.out.println(e.getName()+"要加的薪水是:"+(e.getDegree()*0.8+e.getWorkAges()*0.5)/10*e.getSalary());//
  }
}

/**
 * 定義一個(gè)接受訪問(wèn)操作類,訪問(wèn)者(Visitor)操作函數(shù)的參數(shù)。
 * @description:
 * @date 2016-1-15 下午3:58:28
 */
public abstract class Element {
  public abstract void Acceppt(Visitor visitor);
}

/**
 * 具體元素,實(shí)現(xiàn)了抽象元素(Element)所定義的接受操作接口。
 * @description:
 * @date 2016-1-15 下午4:04:24
 */
public class Staff extends Element {
  private String name;
  private float salary;
  private int workAges;
  private int degree;
  public Staff(String name, float salary, int workAges, int degree) {
    super();
    this.name = name;
    this.salary = salary;
    this.workAges = workAges;
    this.degree = degree;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public float getSalary() {
    return salary;
  }
  public void setSalary(float salary) {
    this.salary = salary;
  }
  public int getWorkAges() {
    return workAges;
  }
  public void setWorkAges(int workAges) {
    this.workAges = workAges;
  }
  public int getDegree() {
    return degree;
  }
  public void setDegree(int degree) {
    this.degree = degree;
  }
  @Override
  public void Acceppt(Visitor visitor) {
    visitor.visit(this);
  }
}

/**
 * 結(jié)構(gòu)對(duì)象:這是使用訪問(wèn)者模式必備的角色。
 * 它具備以下特性:
 * 能枚舉它的元素;
 * 可以提供一個(gè)高層接口以允許訪問(wèn)者訪問(wèn)它的元素;
 * 如有需要,可以設(shè)計(jì)成一個(gè)復(fù)合對(duì)象或者一個(gè)聚集(如一個(gè)列表或無(wú)序集合)。
 * @description:
 * @date 2016-1-15 下午4:26:30
 */
public class StaffObject {
  private HashMap<String, Staff> employees;
  public StaffObject() {
    employees = new HashMap<String, Staff>();
  }
  public void addEmployee(Staff e) {
    if (!employees.containsKey(e.getName())) {
      employees.put(e.getName(), e);
    }
  }
  public void removeEmployee(Staff e) {
    if (employees.containsKey(e.getName())) {
      employees.remove(e);
    }
  }
  public Staff getEmployee(String name) {
    return employees.get(name);
  }
  public void Accept(Visitor v) {
    for (Staff e : employees.values()) {
      e.Acceppt(v);
    }
  }
}

測(cè)試類

public class Test {
  public static void main(String[] args) {
    StaffObject e=new StaffObject();
    e.addEmployee(new Staff("張三", 3000f, 2, 1));
    e.addEmployee(new Staff("李四", 5000f, 4, 2));
    e.addEmployee(new Staff("王五", 8000f, 6, 3));
    e.addEmployee(new Staff("沈七", 10000f, 9, 4));
    e.Accept(new ConcreteVisitor());
  }
}

運(yùn)行結(jié)果:

李四要加的薪水是:1800.0
張三要加的薪水是:540.0
沈七要加的薪水是:7700.0
王五要加的薪水是:4320.0

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評(píng)論

越西县| 手游| 札达县| 泌阳县| 陕西省| 东山县| 临城县| 道真| 宜兰市| 深水埗区| 天津市| 四子王旗| 体育| 陆河县| 磐石市| 安图县| 岳普湖县| 和平县| 游戏| 平乡县| 兰坪| 高青县| 鹤庆县| 万安县| 海兴县| 兰溪市| 保康县| 左贡县| 临泽县| 武城县| 桂东县| 甘泉县| 永宁县| 贺州市| 罗田县| 麻城市| 当涂县| 甘谷县| 万荣县| 博客| 高雄县|