Appearance
访问者模式
定义
访问者模式(Visitor Pattern)是一种行为设计模式,它允许你将算法与对象结构分离,使你在不修改对象结构的情况下,可以添加新的操作。
访问者模式的基本思想是将数据结构和操作分离,通过访问者模式,可以在不改变数据结构的情况下,增加新的操作。访问者模式的核心思想是将数据结构和操作分离,通过访问者模式,可以在不改变数据结构的情况下,增加新的操作。
优点
- 解耦:访问者模式将数据结构和操作分离,使得数据结构可以独立于操作进行变化,从而实现解耦。
- 扩展性:访问者模式可以在不修改数据结构的情况下,增加新的操作,从而实现扩展性。
缺点
- 增加复杂性:访问者模式会增加系统的复杂性,因为需要定义访问者接口和具体访问者类,以及修改数据结构以接受访问者。
- 违反单一职责原则:访问者模式将操作和访问者分离,可能会导致违反单一职责原则。
代码示例
java
public interface RoleVisitor {
void visit(Player player);
void visit(Monster monster);
}
public interface Role {
void accept(RoleVisitor visitor);
}
java
public class Monster implements Role{
private final String name;
private int hp;
private int attack;
private int defense;
public Monster(String name, int hp, int attack, int defense) {
this.name = name;
this.hp = hp;
this.attack = attack;
this.defense = defense;
}
public String getName() {
return name;
}
@Override
public void accept(RoleVisitor visitor) {
visitor.visit(this);
}
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
public int getDefense() {
return defense;
}
public void setDefense(int defense) {
this.defense = defense;
}
}
java
public class Player implements Role{
private final String name;
private int hp;
private int attack;
private int defense;
public Player(String name, int hp, int attack, int defense) {
this.name = name;
this.hp = hp;
this.attack = attack;
this.defense = defense;
}
public String getName() {
return name;
}
@Override
public void accept(RoleVisitor visitor) {
visitor.visit(this);
}
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
public int getDefense() {
return defense;
}
public void setDefense(int defense) {
this.defense = defense;
}
}
java
public class CombatPowerVisitor implements RoleVisitor{
private int power;
@Override
public void visit(Player player) {
power = player.getAttack() * 10 + player.getHp() * 88 + player.getDefense() * 111;
}
@Override
public void visit(Monster monster) {
power = monster.getAttack() * 3 + monster.getHp() * 188 + monster.getDefense() * 134;
}
public int getPower() {
return power;
}
}
java
public class Client {
public static void main(String[] args) {
Monster monster = new Monster("蜘蛛精", 5000, 100, 100);
Player player = new Player("张三", 1000, 50, 50);
CombatPowerVisitor visitor = new CombatPowerVisitor();
monster.accept(visitor);
System.out.printf("角色[%s]战力为:%d\n", monster.getName(), visitor.getPower());
player.accept(visitor);
System.out.printf("角色[%s]战力为:%d\n", player.getName(), visitor.getPower());
}
}
运行结果:
txt
角色[蜘蛛精]战力为:953700
角色[张三]战力为:94050