设计模式之访问者模式
2016-05-09 15:33
239 查看
总体来说设计模式分为三大类:
创建型模式5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
Demo:购物车案例
书编:5678的价格 = 95
香蕉的价格= 20
苹果的价格= 25
总花费= 160
②添加新类别的商品到系统变得容易。只需要改变一下访问者接口以及其实现。已经存在的商品类别不会被干扰影响。
创建型模式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
优点
①如果操作的逻辑改变,我们只需要改变访问者的实现就够了,而不用去修改其他所有的商品类。②添加新类别的商品到系统变得容易。只需要改变一下访问者接口以及其实现。已经存在的商品类别不会被干扰影响。
相关文章推荐
- PHP 不支持CURL的解决方法
- php中curl类常用方法封装和详解
- fzu oj 2236 第十四个目标 树状数组好题 dp
- 【mybatis源码分析】原理分析之三:初始化(配置文件读取和解析)
- 类加载机制(类加载过程和类加载器)
- android 分享------使用友盟社会化组件
- 前端重点知识整理(算法等基础知识)
- iframe子页面调用父页面javascript函数的方法
- 神奇的 BlocksKit (一)
- php-beanstalk扩展发布了
- Quartz2D (5)旋转,缩放,平移
- 二维数组按照指定的键名的值进行排序
- codeforces 651B Beautiful Paintings (思路题)
- Django系列七:Django Nginx+uwsgi 安装配置
- 【小笔记】修改状态条文字的颜色为白色的
- 通过端口 1433 连接到主机 127.0.0.1 的 TCP/IP 连接失败解决方法
- GitHub的注册与使用(详细图解)
- struts2(十)之JSON基础
- 请求所有父控件及祖宗控件不要拦截事件
- 移动web资源整理