admin管理员组文章数量:1560313
现在我们很多人买电脑都是直接买笔记本或者是直接买一个配置好的整机,因为现在笔记本的性能已经能够满足我们日常的开销,而且价格也都在我们接受范围内。
但是我舍友技术迷,买台式的电脑都要自己攒一个,自己买机箱、CPU、主板、显卡等小件,买回来自己组装。
这样可以买到适合自己使用场景的电脑,比如你经常玩儿游戏,你就在显卡这里多花点儿钱。
今天我们以买电脑零件为例来讲一讲——访问者模式
一、是什么
访问者模式:是一种将数据操作和数据结构分离的设计模式。
访问这模式都说是最复杂的设计模式。并且使用频率不高。
看到过一句话:一旦需要使用它的时候,那就是真的需要使用了。
这句话说了,貌似又没说,其中深意你可以自己体会。
我再给你来一句:大病保险,当你需要报销的时候,你就真的需要报销了。
二、长啥样
在下不才,画一个小图示意一下:
Visitor: 这个就是不同的实现方式,每一个Visitor都有自己的思想,都可以在数据结构ObjectStructure的基础上进行散发思维操作,但是我们不会改变ObjectStructure 这就是这个模式的好处。
Visitor01、Visitor01: 访问者具体实现
Element: 这个是不变数据结构的构成属性,不变数据结构ObjectStructure是由多个Element组成
ElementA、ElementB: 具体构成组件
ObjectStructure: 这个就是那个不变的数据结构,我们一定要知道,如果这个结构经常变,那我们不适合用这种设计模式,我们就是为了不修改这个类,不添加if else 才使用的访问者模式
三、怎么做
我们举例:ObjectStructure 是电脑组成,由多个零件Element组成 ,每一个购买者Visitor 都有不同程度的优惠。
Element 数据元素
package visitor;
/**
* @author 木子的昼夜编程
*
* 电脑零件:价格、名称、
*/
public abstract class Element {
double price;
String name;
// 这个是访问者模式的灵魂
// 1. 接收一个参数Visitor
// 2. 直接调用Visitor的visitXXX方法 把自己Element当参数传递进去
abstract void accept(Visitor v);
// 获取基础价格
abstract double getPrice();
}
ElementA 数据元素具体实现A
package visitor;
/**
* @author 木子的昼夜编程
*
* 主板
*/
public class ElementA extends Element{
public ElementA(double price) {
this.price = price;
this.name = "主板";
}
@Override
void accept(Visitor v) {
v.visitElementA(this);
}
@Override
double getPrice() {
return price;
}
}
ElementB 数据元素具体实现B
package visitor;
/**
* @author 木子的昼夜编程
*
*Cpu
*/
public class ElementB extends Element{
public ElementB(double price) {
this.price = price;
this.name = "Cpu";
}
@Override
void accept(Visitor v) {
v.visitElementA(this);
}
@Override
double getPrice() {
return price;
}
}
Visitor 访问者抽象
package visitor;
/**
* @author 木子的昼夜编程
*
* 不同的购买电脑配件的人
*/
public abstract class Visitor {
double totalPrice;
// 访问主板 这就是自定义规则
abstract void visitElementA(Element element);
// 访问CPU 这就是自定义规则
abstract void visitElementB(Element element);
}
Visitor01 具体访问者实现 懂电脑的人
package visitor;
/**
* @author 木子的昼夜编程
*
* 懂电脑的人来买电脑配件 配件都打折
*/
public class Visitor01 extends Visitor {
// 主板8折扣
@Override
public void visitElementA(Element element) {
totalPrice = totalPrice + element.getPrice()*0.8;
}
// CPU 7折
@Override
public void visitElementB(Element element) {
totalPrice = totalPrice + element.getPrice()*0.7;
}
}
Visitor02 具体访问者实现 不懂电脑的人
package visitor;
/**
* @author 木子的昼夜编程
*
* 小白来买电脑配件 配件都打折(先涨价再打折)
*/
public class Visitor02 extends Visitor {
// 主板8折扣 (先多说500块)
@Override
public void visitElementA(Element element) {
totalPrice = totalPrice + (element.getPrice() + 500)*0.8;
}
// CPU 7折 (先多说1000块)
@Override
public void visitElementB(Element element) {
totalPrice = totalPrice + (element.getPrice()+1000)*0.7;
}
}
Test测试
package visitor;
/**
* @author 木子的昼夜编程
*/
public class Test {
public static void main(String[] args) {
// 创建电脑标准价
ObjectStructure os = new ObjectStructure();
// 懂电脑的
Visitor visitor01 = new Visitor01();
// 不懂电脑的
Visitor visitor02 = new Visitor02();
os.acccept(visitor01);
System.out.println("懂电脑价格:"+visitor01.totalPrice);
os.acccept(visitor02);
System.out.println("不懂电脑价格:"+visitor02.totalPrice);
}
}
输出结果:
四、聊聊
小白被坑了吧,千万别看打折打折就以为便宜。
访问者模式,等你觉得需要的时候,你就真的需要了。
有一点一定要注意,前提是这个数据结构ObjectStructure不经常变
你看我例子中,电脑肯定不变的总不能出个APU吧。
你要是跟我说价格会变,那我。。。 价格当参数传递进来就好了,我懒,写死了。
我乐意。
版权声明:本文标题:攒电脑(访问者模式) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1727434970a1114409.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论