黑备忘录
public interface Memento {
}
public class GameRole {
private int vit;
private int atk;
private int def;
public void initState() {
this.vit = 100;
this.atk = 100;
this.def = 100;
}
public void fight() {
this.vit = 0;
this.atk = 0;
this.def = 0;
}
public Memento saveState() {
return new RoleStateMemento(vit, atk, def);
}
public void recoverState(Memento memento) {
RoleStateMemento roleStateMemento = (RoleStateMemento) memento;
this.vit = roleStateMemento.getVit();
this.atk = roleStateMemento.getAtk();
this.def = roleStateMemento.getDef();
}
public void stateDisplay() {
System.out.println("角色生命力:" + vit);
System.out.println("角色攻击力:" + atk);
System.out.println("角色防御力:" + def);
}
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
public int getDef() {
return def;
}
public void setDef(int def) {
this.def = def;
}
private class RoleStateMemento implements Memento {
private int vit;
private int atk;
private int def;
public RoleStateMemento(int vit, int atk, int def) {
this.vit = vit;
this.atk = atk;
this.def = def;
}
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
public int getDef() {
return def;
}
public void setDef(int def) {
this.def = def;
}
}
}
public class RoleStateCaretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
public class Client {
public static void main(String[] args) {
System.out.println("------------大战Boss前------------");
GameRole gameRole = new GameRole();
gameRole.initState();
gameRole.stateDisplay();
RoleStateCaretaker roleStateCaretaker = new RoleStateCaretaker();
roleStateCaretaker.setMemento(gameRole.saveState());
System.out.println("------------大战Boss后------------");
gameRole.fight();
gameRole.stateDisplay();
System.out.println("------------恢复之前状态------------");
gameRole.recoverState(roleStateCaretaker.getMemento());
gameRole.stateDisplay();
}
}
白备忘录
public class RoleStateMemento {
private int vit;
private int atk;
private int def;
public RoleStateMemento(int vit, int atk, int def) {
this.vit = vit;
this.atk = atk;
this.def = def;
}
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
public int getDef() {
return def;
}
public void setDef(int def) {
this.def = def;
}
}
public class GameRole {
private int vit;
private int atk;
private int def;
public void initState() {
this.vit = 100;
this.atk = 100;
this.def = 100;
}
public void fight() {
this.vit = 0;
this.atk = 0;
this.def = 0;
}
public RoleStateMemento saveState() {
return new RoleStateMemento(vit, atk, def);
}
public void recoverState(RoleStateMemento roleStateMemento) {
this.vit = roleStateMemento.getVit();
this.atk = roleStateMemento.getAtk();
this.def = roleStateMemento.getDef();
}
public void stateDisplay() {
System.out.println("角色生命力:" + vit);
System.out.println("角色攻击力:" + atk);
System.out.println("角色防御力:" + def);
}
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
public int getDef() {
return def;
}
public void setDef(int def) {
this.def = def;
}
}
public class RoleStateCaretaker {
private RoleStateMemento roleStateMemento;
public RoleStateMemento getRoleStateMemento() {
return roleStateMemento;
}
public void setRoleStateMemento(RoleStateMemento roleStateMemento) {
this.roleStateMemento = roleStateMemento;
}
}
public class Client {
public static void main(String[] args) {
System.out.println("------------大战Boss前------------");
GameRole gameRole = new GameRole();
gameRole.initState();
gameRole.stateDisplay();
RoleStateCaretaker roleStateCaretaker = new RoleStateCaretaker();
roleStateCaretaker.setRoleStateMemento(gameRole.saveState());
System.out.println("------------大战Boss后------------");
gameRole.fight();
gameRole.stateDisplay();
System.out.println("------------恢复之前状态------------");
gameRole.recoverState(roleStateCaretaker.getRoleStateMemento());
gameRole.stateDisplay();
}
}
访问者
public interface Animal {
void accept(Person person);
}
public class Cat implements Animal {
@Override
public void accept(Person person) {
person.feed(this);
System.out.println("好好吃,喵喵喵!!!");
}
}
public class Dog implements Animal {
@Override
public void accept(Person person) {
person.feed(this);
System.out.println("好好吃,汪汪汪!!!");
}
}
public interface Person {
void feed(Cat cat);
void feed(Dog dog);
}
public class Owner implements Person {
@Override
public void feed(Cat cat) {
System.out.println("主人喂食猫");
}
@Override
public void feed(Dog dog) {
System.out.println("主人喂食狗");
}
}
public class Someone implements Person {
@Override
public void feed(Cat cat) {
System.out.println("其他人喂食猫");
}
@Override
public void feed(Dog dog) {
System.out.println("其他人喂食狗");
}
}
import java.util.ArrayList;
import java.util.List;
public class Home {
private List<Animal> nodeList = new ArrayList<Animal>();
public void action(Person person) {
for (Animal node : nodeList) {
node.accept(person);
}
}
public void add(Animal animal) {
nodeList.add(animal);
}
}
public class Client {
public static void main(String[] args) {
Home home = new Home();
home.add(new Dog());
home.add(new Cat());
Owner owner = new Owner();
home.action(owner);
System.out.println("------------更换访问者------------");
Someone someone = new Someone();
home.action(someone);
}
}
主人喂食狗
好好吃,汪汪汪!!!
主人喂食猫
好好吃,喵喵喵!!!
------------更换访问者------------
其他人喂食狗
好好吃,汪汪汪!!!
其他人喂食猫
好好吃,喵喵喵!!!
中介
public abstract class Person {
protected String name;
protected Mediator mediator;
public Person(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
public class HouseOwner extends Person {
public HouseOwner(String name, Mediator mediator) {
super(name, mediator);
}
public void constact(String message) {
mediator.constact(message, this);
}
public void getMessage(String message) {
System.out.println("房主" + name + "获取到的信息:" + message);
}
}
public class Tenant extends Person {
public Tenant(String name, Mediator mediator) {
super(name, mediator);
}
public void constact(String message) {
mediator.constact(message, this);
}
public void getMessage(String message) {
System.out.println("租房者" + name + "获取到的信息:" + message);
}
}
public abstract class Mediator {
public abstract void constact(String message, Person person);
}
public class MediatorStructure extends Mediator {
private HouseOwner houseOwner;
private Tenant tenant;
public HouseOwner getHouseOwner() {
return houseOwner;
}
public void setHouseOwner(HouseOwner houseOwner) {
this.houseOwner = houseOwner;
}
public Tenant getTenant() {
return tenant;
}
public void setTenant(Tenant tenant) {
this.tenant = tenant;
}
public void constact(String message, Person person) {
if (person == houseOwner) {
tenant.getMessage(message);
} else {
houseOwner.getMessage(message);
}
}
}
public class Client {
public static void main(String[] args) {
MediatorStructure mediator = new MediatorStructure();
HouseOwner houseOwner = new HouseOwner("张三", mediator);
Tenant tenant = new Tenant("李四", mediator);
mediator.setHouseOwner(houseOwner);
mediator.setTenant(tenant);
tenant.constact("需要租三室的房子");
houseOwner.constact("我这有三室的房子,你需要租吗?");
}
}
房主张三获取到的信息:需要租三室的房子
租房者李四获取到的信息:我这有三室的房子,你需要租吗?
观察者模式
public interface Observer {
void update(String message);
}
public class WeixinUser implements Observer {
private String name;
public WeixinUser(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + "-" + message);
}
}
public interface Subject {
public void attach(Observer observer);
public void detach(Observer observer);
public void notify(String message);
}
import java.util.ArrayList;
import java.util.List;
public class SubscriptionSubject implements Subject {
private List<Observer> weixinUserlist = new ArrayList<Observer>();
@Override
public void attach(Observer observer) {
weixinUserlist.add(observer);
}
@Override
public void detach(Observer observer) {
weixinUserlist.remove(observer);
}
@Override
public void notify(String message) {
for (Observer observer : weixinUserlist) {
observer.update(message);
}
}
}
public class Client {
public static void main(String[] args) {
SubscriptionSubject mSubscriptionSubject=new SubscriptionSubject();
WeixinUser user1=new WeixinUser("孙悟空");
WeixinUser user2=new WeixinUser("猪悟能");
WeixinUser user3=new WeixinUser("沙悟净");
mSubscriptionSubject.attach(user1);
mSubscriptionSubject.attach(user2);
mSubscriptionSubject.attach(user3);
mSubscriptionSubject.notify("传智黑马的专栏更新了");
}
}
孙悟空-传智黑马的专栏更新了
猪悟能-传智黑马的专栏更新了
沙悟净-传智黑马的专栏更新了
迭代器
public class Student {
}
public interface StudentAggregate {
void addStudent(Student student);
void removeStudent(Student student);
StudentIterator getStudentIterator();
}
import java.util.ArrayList;
import java.util.List;
public class StudentAggregateImpl implements StudentAggregate {
private List<Student> list = new ArrayList<Student>();
@Override
public void addStudent(Student student) {
this.list.add(student);
}
@Override
public void removeStudent(Student student) {
this.list.remove(student);
}
@Override
public StudentIterator getStudentIterator() {
return new StudentIteratorImpl(list);
}
}
public interface StudentIterator {
boolean hasNext();
Student next();
}
import java.util.List;
public class StudentIteratorImpl implements StudentIterator {
private List<Student> list;
private int position = 0;
public StudentIteratorImpl(List<Student> list) {
this.list = list;
}
@Override
public boolean hasNext() {
return position < list.size();
}
@Override
public Student next() {
Student currentStudent = list.get(position);
position++;
return currentStudent;
}
}
状态
public abstract class LiftState {
protected Context context;
public void setContext(Context context) {
this.context = context;
}
public abstract void open();
public abstract void close();
public abstract void run();
public abstract void stop();
}
public class OpenningState extends LiftState {
@Override
public void open() {
System.out.println("电梯门开启...");
}
@Override
public void close() {
super.context.setLiftState(Context.closeingState);
super.context.getLiftState().close();
}
@Override
public void run() {
}
@Override
public void stop() {
}
}
public class ClosingState extends LiftState {
@Override
public void close() {
System.out.println("电梯门关闭...");
}
@Override
public void open() {
super.context.setLiftState(Context.openningState);
super.context.open();
}
@Override
public void run() {
super.context.setLiftState(Context.runningState);
super.context.run();
}
@Override
public void stop() {
super.context.setLiftState(Context.stoppingState);
super.context.stop();
}
}
public class RunningState extends LiftState {
@Override
public void open() {
}
@Override
public void close() {
}
@Override
public void run() {
System.out.println("电梯正在运行...");
}
@Override
public void stop() {
super.context.setLiftState(Context.stoppingState);
super.context.stop();
}
}
public class StoppingState extends LiftState {
@Override
public void open() {
super.context.setLiftState(Context.openningState);
super.context.getLiftState().open();
}
@Override
public void close() {
super.context.setLiftState(Context.closeingState);
super.context.getLiftState().close();
}
@Override
public void run() {
super.context.setLiftState(Context.runningState);
super.context.getLiftState().run();
}
@Override
public void stop() {
System.out.println("电梯停止了...");
}
}
public class Context {
public final static OpenningState openningState = new OpenningState();
public final static ClosingState closeingState = new ClosingState();
public final static RunningState runningState = new RunningState();
public final static StoppingState stoppingState = new StoppingState();
private LiftState liftState;
public LiftState getLiftState() {
return this.liftState;
}
public void setLiftState(LiftState liftState) {
this.liftState = liftState;
this.liftState.setContext(this);
}
public void open() {
this.liftState.open();
}
public void close() {
this.liftState.close();
}
public void run() {
this.liftState.run();
}
public void stop() {
this.liftState.stop();
}
}
public class Client {
public static void main(String[] args) {
Context context = new Context();
context.setLiftState(new RunningState());
context.open();
context.close();
context.run();
context.stop();
}
}
运行的时候开电梯门?你疯了!电梯不会给你开的
虽然可以关门,但这个动作不归RunningState执行
电梯正在运行...
电梯停止了...
适配
public interface SDCard {
String readSD();
void writeSD(String msg);
}
public class SDCardImpl implements SDCard {
public String readSD() {
String msg = "sd card read a msg :hello word SD";
return msg;
}
public void writeSD(String msg) {
System.out.println("sd card write msg : " + msg);
}
}
public class Computer {
public String readSD(SDCard sdCard) {
if (sdCard == null) {
throw new NullPointerException("sd card null");
}
return sdCard.readSD();
}
}
public interface TFCard {
String readTF();
void writeTF(String msg);
}
public class TFCardImpl implements TFCard {
public String readTF() {
String msg = "tf card read msg : hello word tf card";
return msg;
}
public void writeTF(String msg) {
System.out.println("tf card write a msg : " + msg);
}
}
public class SDAdapterTF extends TFCardImpl implements SDCard {
public String readSD() {
System.out.println("adapter read tf card ");
return readTF();
}
public void writeSD(String msg) {
System.out.println("adapter write tf card");
writeTF(msg);
}
}
public class Client {
public static void main(String[] args) {
Computer computer = new Computer();
SDCard sdCard = new SDCardImpl();
System.out.println(computer.readSD(sdCard));
System.out.println("------------");
SDAdapterTF adapter = new SDAdapterTF();
System.out.println(computer.readSD(adapter));
}
}
sd card read a msg :hello word SD
------------
adapter read tf card
tf card read msg : hello word tf card
装饰
@Data
public abstract class FastFood {
private float price;
private String desc;
public FastFood() {
}
public FastFood(float price, String desc) {
this.price = price;
this.desc = desc;
}
public abstract float cost();
}
public class FriedNoodles extends FastFood {
public FriedNoodles() {
super(12, "炒面");
}
public float cost() {
return getPrice();
}
}
public class FriedRice extends FastFood {
public FriedRice() {
super(10, "炒饭");
}
public float cost() {
return getPrice();
}
}
public abstract class Garnish extends FastFood {
private FastFood fastFood;
public Garnish(FastFood fastFood, float price, String desc) {
super(price, desc);
this.fastFood = fastFood;
}
public FastFood getFastFood() {
return fastFood;
}
public void setFastFood(FastFood fastFood) {
this.fastFood = fastFood;
}
}
public class Bacon extends Garnish {
public Bacon(FastFood fastFood) {
super(fastFood, 2, "培根");
}
@Override
public float cost() {
return getPrice() + getFastFood().getPrice();
}
@Override
public String getDesc() {
return super.getDesc() + getFastFood().getDesc();
}
}
public class Egg extends Garnish {
public Egg(FastFood fastFood) {
super(fastFood, 1, "鸡蛋");
}
public float cost() {
return getPrice() + getFastFood().getPrice();
}
@Override
public String getDesc() {
return super.getDesc() + getFastFood().getDesc();
}
}
public class Client {
public static void main(String[] args) {
FastFood food = new FriedRice();
System.out.println(food.getDesc() + " " + food.cost() + "元");
System.out.println("========");
FastFood food1 = new FriedRice();
food1 = new Egg(food1);
System.out.println(food1.getDesc() + " " + food1.cost() + "元");
System.out.println("========");
FastFood food2 = new FriedNoodles();
food2 = new Bacon(food2);
System.out.println(food2.getDesc() + " " + food2.cost() + "元");
}
}
炒饭 10.0元
========
鸡蛋炒饭 11.0元
========
培根炒面 14.0元
组合
public abstract class MenuComponent {
protected String name;
protected int level;
public void add(MenuComponent menuComponent) {
throw new UnsupportedOperationException();
}
public void remove(MenuComponent menuComponent) {
throw new UnsupportedOperationException();
}
public MenuComponent getChild(int i) {
throw new UnsupportedOperationException();
}
public String getName() {
return name;
}
public void print() {
throw new UnsupportedOperationException();
}
}
public class Menu extends MenuComponent {
private final List<MenuComponent> menuComponentList;
public Menu(String name, int level) {
this.level = level;
this.name = name;
menuComponentList = new ArrayList<MenuComponent>();
}
@Override
public void add(MenuComponent menuComponent) {
menuComponentList.add(menuComponent);
}
@Override
public void remove(MenuComponent menuComponent) {
menuComponentList.remove(menuComponent);
}
@Override
public MenuComponent getChild(int i) {
return menuComponentList.get(i);
}
@Override
public void print() {
for (int i = 1; i < level; i++) {
System.out.print("--");
}
System.out.println(name);
for (MenuComponent menuComponent : menuComponentList) {
menuComponent.print();
}
}
}
public class MenuItem extends MenuComponent {
public MenuItem(String name, int level) {
this.name = name;
this.level = level;
}
@Override
public void print() {
for (int i = 1; i < level; i++) {
System.out.print("--");
}
System.out.println(name);
}
}
public class Client {
public static void main(String[] args) {
MenuComponent topMenu = new Menu("顶级菜单", 1);
MenuComponent cd1 = new Menu("菜单1", 2);
MenuComponent cd2 = new Menu("菜单2", 2);
MenuComponent cd3 = new Menu("菜单3", 2);
topMenu.add(cd1);
topMenu.add(cd2);
topMenu.add(cd3);
MenuComponent cd11 = new MenuItem("菜单11", 3);
MenuComponent cd21 = new MenuItem("菜单21", 3);
MenuComponent cd31 = new MenuItem("菜单31", 3);
cd1.add(cd11);
cd2.add(cd21);
cd3.add(cd31);
topMenu.print();
}
}```
* 测试结果
```java
顶级菜单
--菜单1
----菜单11
--菜单2
----菜单21
--菜单3
----菜单31
责任链
public class LeaveRequest {
private final String name;
private final int num;
private String content;
public LeaveRequest(String name, int num, String content) {
this.name = name;
this.num = num;
this.content = content;
}
public String getName() {
return name;
}
public int getNum() {
return num;
}
public String getContent() {
return content;
public abstract class Handler {
protected final static int NUM_ONE = 1;
protected final static int NUM_THREE = 3;
protected final static int NUM_SEVEN = 7;
private final int numStart;
private int numEnd;
private Handler nextHandler;
public Handler(int numStart) {
this.numStart = numStart;
}
public Handler(int numStart, int numEnd) {
this.numStart = numStart;
this.numEnd = numEnd;
}
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public final void submit(LeaveRequest leave) {
if (0 == this.numStart) {
return;
}
if (leave.getNum() >= this.numStart) {
this.handleLeave(leave);
if (null != this.nextHandler && leave.getNum() > numEnd) {
this.nextHandler.submit(leave);
} else {
System.out.println("流程结束");
}
}
}
protected abstract void handleLeave(LeaveRequest leave);
}
public class GroupLeader extends Handler {
public GroupLeader() {
super(Handler.NUM_ONE, Handler.NUM_THREE);
}
@Override
protected void handleLeave(LeaveRequest leave) {
System.out.println(leave.getName() + "请假" + leave.getNum() + "天," + leave.getContent() + "。");
System.out.println("小组长审批:同意。");
}
}
public class Manager extends Handler {
public Manager() {
super(Handler.NUM_THREE, Handler.NUM_SEVEN);
}
@Override
protected void handleLeave(LeaveRequest leave) {
System.out.println(leave.getName() + "请假" + leave.getNum() + "天," + leave.getContent() + "。");
System.out.println("部门经理审批:同意。");
}
}
public class GeneralManager extends Handler {
public GeneralManager() {
super(Handler.NUM_SEVEN);
}
@Override
protected void handleLeave(LeaveRequest leave) {
System.out.println(leave.getName() + "请假" + leave.getNum() + "天," + leave.getContent() + "。");
System.out.println("总经理审批:同意。");
}
}
public class Client {
public static void main(String[] args) {
LeaveRequest leave = new LeaveRequest("小花", 100, "身体不适");
GroupLeader groupLeader = new GroupLeader();
Manager manager = new Manager();
GeneralManager generalManager = new GeneralManager();
groupLeader.setNextHandler(manager);
manager.setNextHandler(generalManager);
groupLeader.submit(leave);
}
}
小花请假100天,身体不适。
小组长审批:同意。
小花请假100天,身体不适。
部门经理审批:同意。
小花请假100天,身体不适。
总经理审批:同意。
流程结束