您的位置:首页 > 其它

设计模式之访问者模式

2016-05-09 15:33 239 查看
总体来说设计模式分为三大类:

创建型模式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

优点

①如果操作的逻辑改变,我们只需要改变访问者的实现就够了,而不用去修改其他所有的商品类。

②添加新类别的商品到系统变得容易。只需要改变一下访问者接口以及其实现。已经存在的商品类别不会被干扰影响。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: