设计模式之第20章-访问者模式(Java实现)

  “嘿,你脸好红啊。”“精神焕发。”“怎么又黄了?”“怕冷,涂的,涂的,蜡。”“身上还有酒味,露馅了吧,原来是喝酒喝的啊。”“嘿嘿,让,让你发现了,今天来几个朋友,然后就小聚一下,小饮,几杯啦。”“小日子过得不错嘛。”“那是自然,要不然,再去喝两杯。”“别介,我还有要事要做呢,鱼哥你别坑我。”“什么,什么要紧事,能比的上,喝酒啊”。“走,陪我,陪我喝两杯去。”(作者已被拉走。)访问者登场。

访问者模式之自我介绍

  累的死俺的杰特们(ladies and gentlemen),大家好,我地球土生土长的模式,叫做访问者。定义是:Represent an operation to be performed on the elements of an object strctrue.Visitor lets you define a new operation without changing the classes of the elements on which it operates.译过来的意思是:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。通用类图是:

  有关于每个类的定义以及解释由于图中已经做了详细的解释,我也就不再赘述了~

访问者模式之自我分析

  我晓得又该做什么劳什子自我分析,好吧,你们的口味是先听缺点再听优点,我偏不这么来,我要先介绍我的优点:

  • 首先呢,额可是很符合传说中的单一职责原则,具体的元素角色负责数据的加载,Visitor为每一个类声明一个Visit操作,两个不同的职责非常明确的分离出来,各自演绎变化。
  • 其次呢,我拥有优秀的扩展性。由于职责分开,想要增加对数据的操作是很简单的。
  • 最后捏,灵活性非常高。

  接下来,我就说一说我的缺点撒:

  • 具体元素访问对访问者公布了细节,不符合迪米特法则。
  • 然后就是具体元素变更比较困难。
  • 最后嘛,我还不小心违背了依赖倒置原则。访问者依赖的是具体元素,而不是抽象元素,这破坏了依赖倒置原则。

  恩,优缺点貌似就这么多了,如果你们觉得还有什么,尽可提出。

访问模式之实现

  本着即兴编码的准则,我就以鱼哥聚餐为例来举个栗子吧,首先嘛,自然是抽象元素的实现了:

 public abstract class Element{
//业务逻辑
public abstract void doSth();
//允许来访者
public abstract void accept(IVisitor visitor);
}

  抽象元素的定义比较简单,就两个抽象方法,一个是业务逻辑的,一个是接受来访者拜访的抽象方法,接下来就是具体元素的实现类了:

 public class COncreteElement2 extends Element{
//吃大餐
public void doSth(){
System.out.println("吃大餐");
}
public void accept(IVisitor visitor){
visitor.visit(this);
}
}

  这是第一个抽象类的具体实现,其实就是聚餐的主题之一,吃撒,接着是聚餐的第二大主题,喝撒,没听到领导经常说的嘛:“大家吃好喝好啊~”:

 public class ConcreteElement1 extends Element{
//喝酒
public viod doSth(){
System.out.println("聚餐是要喝酒的");
}
public void accept(IVisitor visitor){
visitor.visit(this);
}
}

  接下来呢,就是接口访问者了:

 public interface IVisitor{
public void visit(ConcreteElement1 el1);
public void visit(ConcreteElement2 el2);
}

  怎么样,是不是超级简单呢?其实吧,有几个具体元素类,就有几个访问方法与之对应。然后就是具体访问者的实现:

 public class Visitor implements IVisitor{
public void visit(ConcreteElement1 el1){
el1.doSth();
}
public void visit(ConcreteElement2 el2){
el2.doSth();
}
}

  其实也就是两个元素的访问,没什么的。结构对象就是提供一个访问对象的接口而已了:

 public class ObjectStruture{
//对象生成器
public static Element createElement(){
//掷硬币,决定先吃饭还是先喝酒
Random rand = new Random();
if(rand.nextInt(2)>1){
return new ConcreteElement1();
}
else {
return new ConcreteElement2();
}
}
}

  好了,至此实现完毕。

访问者模式之应用场景

  • 一个对象结构包含很多类对象,它们有不同的接口,你呢,又想对这些对象实施一些依赖于其具体类的操作的时候。用我吧。
  • 当你需要对一个对象结构中的对象进行很多不同的并且不相关的操作,你又不想让这些操作“污染”这些对象类。请用访问者。
  • 当你定义对象结构的类很少改变,但经常需要在此结构定义新的操作的时候。来试试访问者。

  不早了,该回去洗洗睡了,鱼哥还等着我喝酒呢,那就拜拜了您呐~预知后事如何,且听下回分解内您那~

  PS:本博客欢迎转发,但请注明博客地址及作者~

  博客地址:http://www.cnblogs.com/voidy/

  博客新址:http://voidy.net

  <。)#)))≦

设计模式之第20章-访问者模式(Java实现)的更多相关文章

  1. 设计模式之第16章-代理模式(Java实现)

    设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...

  2. 设计模式之第7章-外观模式(Java实现)

    设计模式之第7章-外观模式(Java实现) “鱼哥,知道怎么把大象装进冰箱里面么?”(作者按:这么简单的问题还想考我,早了几百年吧.)“把大象装进冰箱里,一共需要三步:第一步,把冰箱门打开:第二步,把 ...

  3. 设计模式之第22章-组合模式(Java实现)

    设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...

  4. 设计模式之第21章-状态模式(Java实现)

    设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...

  5. 设计模式之第17章-备忘录模式(Java实现)

    设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...

  6. 设计模式之第14章-命令模式(Java实现)

    设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...

  7. 设计模式之第11章-建造者模式(Java实现)

    设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...

  8. 设计模式之第10章-桥接模式(Java实现)

    设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...

  9. 设计模式之第9章-原型模式(Java实现)

    设计模式之第9章-原型模式(Java实现) “快到春节了,终于快放假了,天天上班好累的说.”“确实啊,最近加班比较严重,项目快到交付了啊.”“话说一到过节,就收到铺天盖地的短信轰炸,你说发短信就发吧, ...

随机推荐

  1. 使用JS实现图片轮播(前后首尾相接)

    最近各种跑面试,终于还是被问到这个,一脑子浆糊,当时没想出来首尾相接怎么搞,回来之后研究了一波,终于搞出来了,不多说,直接看代码 代码参考了一位已经写好了图片轮播功能的(在此表示感谢),但是没有首尾相 ...

  2. SqlServer查询文件组被占用情况

    在SqlServer中,删除一个文件组 alter database [xxxxx] remove filegroup FGMonthTurnIntroduceByMonth13 有时候会遇到如下报错 ...

  3. c++ STL deque容器成员函数

    deque是双向队列,即可以在头部插入删除,也可以在尾部插入删除.内部并不连续,这一点和vector并不一样.可能第1个元素和第2个元素的地址是不连在一起的.在使用时用it迭代器会安全一点. 这是c+ ...

  4. 百度地图API 基础入门

    一.注册账号,获取密钥 流程-注册-登录-控制台-创建应用-获取密钥: 1.你想要调取百度地图,首先,你需要注册一个百度账号,获取密匙. 2.密钥获取以后,引入到你需要调用百度地图的界面中. 二.创建 ...

  5. POJ 3666 Making the Grade(区间dp)

    修改序列变成非递减序列,使得目标函数最小.(这题数据有问题,只要求非递减 从左往右考虑,当前a[i]≥前一个数的取值,当固定前一个数的取值的时候我们希望前面操作的花费尽量小. 所以状态可以定义为dp[ ...

  6. bzoj3312: [Usaco2013 Nov]No Change

    题意: K个硬币,要买N个物品.K<=16,N<=1e5 给定买的顺序,即按顺序必须是一路买过去,当选定买的东西物品序列后,付出钱后,货主是不会找零钱的.现希望买完所需要的东西后,留下的钱 ...

  7. C++之RAII惯用法

    http://blog.csdn.net/hunter8777/article/details/6327704 C++中的RAII全称是“Resource acquisition is initial ...

  8. iOS开发遇到的坑之七--上传app Stroe被拒绝:The app references non-public symbols in : _UICreateCGImageFromIOSurface

    这是上学期遇到的问题了,突然查阅邮箱的时候发现了,遂在这里记录下来,希望大家以后注意这个问题 我上传App Store的时候,apple给我发的邮件原文: Dear developer, We hav ...

  9. 【转载】SQLServer中char、varchar、nchar、nvarchar的区别:

    (1)       定义: char:    固定长度,存储ANSI字符,不足的补英文半角空格. nchar:   固定长度,存储Unicode字符,不足的补英文半角空格 varchar:  可变长度 ...

  10. matplotlib(二)——matplotlib控制坐标轴第一个刻度到原点距离

    一.问题描述 具体问题是: 用python库matplotlib进行数据的图表展示: 横坐标是自定义统计值: 保存矢量图(svg),保存后发现横坐的第一个点离坐标原点距离较大,导致图形离y轴较远,让画 ...