访问者模式实例
![image]()
public abstract class Goods implements GoodsElement {
public String name;
public double cost;
GoodsVisitor visitor;
public abstract double discount();
public void accept(GoodsVisitor visitor) {
this.visitor = visitor;
}
}
public class MilkGoods extends Goods {
public MilkGoods(String name, double cost) {
this.name=name;
this.cost=cost;
}
@Override
public double discount() {
return visitor.milkDiscount(this);
}
}
public class CherryGoods extends Goods {
public CherryGoods(String name, double cost) {
this.name=name;
this.cost = cost;
}
@Override
public double discount() {
return visitor.cherryDiscount(this);
}
}
public interface GoodsVisitor {
double milkDiscount(Goods milk);
double cherryDiscount(Goods cherry);
}
public class GoodsVisitor_5_30 implements GoodsVisitor {
@Override
public double milkDiscount(Goods milk) {
return milk.cost * 0.9; // 九折
}
@Override
public double cherryDiscount(Goods cherry) {
if (cherry.cost < 300) { // 满减
return cherry.cost;
} else {
return cherry.cost - 30;
}
}
}
public class MainClass {
public static void main(String[] args) {
GoodsVisitor visitor = new GoodsVisitor_5_30();
MilkGoods milkGoods = new MilkGoods("牛奶", 100);
milkGoods.accept(visitor);
System.out.println(milkGoods.name + " " + milkGoods.discount());
CherryGoods cherryGoods1 = new CherryGoods("樱桃", 300);
cherryGoods1.accept(visitor);
System.out.println(cherryGoods1.name + " " + cherryGoods1.discount());
CherryGoods cherryGoods2 = new CherryGoods("樱桃", 299);
cherryGoods2.accept(visitor);
System.out.println(cherryGoods2.name + " " + cherryGoods2.discount());
}
}
//输出:
// 牛奶 90.0
// 樱桃 270.0
// 樱桃 299.0
建造者模式
![image]()
public interface Builder {
void buildBoard();
void buildDisplay();
void buildOs();
Computer build();
}
public class BuilderComputer implements Builder {
private Computer mComputer = new Computer();
@Override
public void buildBoard() {
mComputer.mBoard = "英特尔主板";
}
@Override
public void buildDisplay() {
mComputer.mDisplay = "Retina显示器";
}
@Override
public void buildOs() {
mComputer.mOs = "Mac OS X 12";
}
@Override
public Computer build() {
return mComputer;
}
}
public class Computer {
public String mBoard;
public String mDisplay;
public String mOs;
}
public class Director {
private Builder mBuilser;
public Director(Builder builer) {
this.mBuilser = builer;
}
public void construct() {
mBuilser.buildDisplay();
mBuilser.buildBoard();
mBuilser.buildOs();
}
}
public class Test {
public static void main(String[] args) {
Builder builder = new BuilderComputer();
Director pcDirector = new Director(builder);
pcDirector.construct();
Computer computer = builder.build();
System.out.println("显示器名称:" + computer.mDisplay);
System.out.println("主板名称:" + computer.mBoard);
System.out.println("操作系统名称:" + computer.mOs);
}
}
//输出:
// 显示器名称:Retina显示器
// 主板名称:英特尔主板
// 操作系统名称:Mac OS X 12