设计模式之访问者模式
来源:互联网 发布:ac尼尔森 网购数据 编辑:程序博客网 时间:2024/06/06 15:03
总体来说设计模式分为三大类:
创建型模式5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
访问者模式
访问者模式是一种行为设计模式。访问者模式被用在针对一组相同类型对象的操作
Demo:购物车案例
首先,创建商品类型接口
public interface ItemElement { public int accept(ShoppingCartVisitor visitor);//参数传入的是访问者}
其次,创建商品类型实体类
public class Book implements ItemElement { private int price; private String isbnNumber;// 国际标准图书编号 public Book(int cost, String isbn){ this.price=cost; this.isbnNumber=isbn; } public int getPrice() { return price; } public String getIsbnNumber() { return isbnNumber; } @Override public int accept(ShoppingCartVisitor visitor) { return visitor.visit(this); }}
public class Fruit implements ItemElement { private int pricePerKg;//每公斤价格 private int weight; private String name; public Fruit(int priceKg, int wt, String nm){ this.pricePerKg=priceKg; this.weight=wt; this.name = nm; } public int getPricePerKg() { return pricePerKg; } public int getWeight() { return weight; } public String getName(){ return this.name; } @Override public int accept(ShoppingCartVisitor visitor) { return visitor.visit(this); }}
然后,创建访问者接口
public interface ShoppingCartVisitor { int visit(Book book); int visit(Fruit fruit);}
其后,创建访问者实体类
public class ShoppingCartVisitorImpl implements ShoppingCartVisitor { @Override public int visit(Book book) { int cost=0; if(book.getPrice() > 50){//当书的价格高于50¥,减价5¥ cost = book.getPrice()-5; }else cost = book.getPrice(); System.out.println("书编:"+book.getIsbnNumber() + "的价格="+cost); return cost; } @Override public int visit(Fruit fruit) { int cost = fruit.getPricePerKg()*fruit.getWeight(); System.out.println(fruit.getName() + "的价格 = "+cost); return cost; }}
接着,创建测试类
public class ShoppingCartClient { public static void main(String[] args) { ItemElement[] items = new ItemElement[]{new Book(20, "1234"),new Book(100, "5678"), new Fruit(10, 2, "香蕉"), new Fruit(5, 5, "苹果")}; int total = calculatePrice(items); System.out.println("总花费 = "+total); } private static int calculatePrice(ItemElement[] items) { ShoppingCartVisitor visitor = new ShoppingCartVisitorImpl(); int sum=0; for(ItemElement item : items){ sum = sum + item.accept(visitor); } return sum; }}
最后,查看输出结果
书编:1234的价格 = 20
书编:5678的价格 = 95
香蕉的价格= 20
苹果的价格= 25
总花费= 160
优点
①如果操作的逻辑改变,我们只需要改变访问者的实现就够了,而不用去修改其他所有的商品类。
②添加新类别的商品到系统变得容易。只需要改变一下访问者接口以及其实现。已经存在的商品类别不会被干扰影响。
0 0
- 设计模式之访问者
- 设计模式之访问者
- 设计模式之访问者模式
- 设计模式之--访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 【设计模式】之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- Mac OS X下搭建Python3.5.1+PyQt5.6开发环境
- 二叉搜索树的后序遍历序列
- 神奇的 BlocksKit (二)
- 移动端自适应方法
- 主成分分析PCA工作原理和简单介绍
- 设计模式之访问者模式
- vxlan和IPsec结合使用
- iOS字体包导入过程
- select、poll、epoll之间的区别总结
- android分享 ------ 友盟分享(续)
- 【mybatis源码分析】原理分析之四:一次SQL查询的源码分析
- hrbust/哈理工oj 1617 回家【BFS+BFS】
- GNU __attribute__ 机制
- 插入排序C++实现