
//定义抽象模板
public abstract class CookTemplate {
/**
* 定义算法:定义好了模板
* 父类可以实现某些步骤
* 留关键给子类
*/
public void cook(){
//定义算法步骤
heating();
addfood();
addsalt();
stirfry();
end();
}
//加热方法
public void heating(){
System.out.println("开火...");
};
//添加食物
public abstract void addfood();
//加盐
public abstract void addsalt();
//翻炒
public void stirfry(){
System.out.println("翻炒中...");
};
//出锅
public void end(){
System.out.println("出锅....");
};
}
//关键细节,放什么菜和调料
public class AutoCookMachine extends CookTemplate{
@Override
public void addfood() {
System.out.println("放了三个小白菜");
}
@Override
public void addsalt() {
System.out.println("放了三勺盐");
}
}

//游戏的环境类
public class TeamGNR {
//抽取游戏策略算法,并进行引用
private GameStrategy gameStrategy;
public void setGameStrategy(GameStrategy gameStrategy) {
this.gameStrategy = gameStrategy;
}
public void startGame(){
System.out.println("游戏开始.....");
//游戏策略
gameStrategy.warStrategy();
System.out.println("游戏结束......");
}
}
//抽象的策略
public interface GameStrategy {
//战斗策略
void warStrategy();
}
//实现自己的策略,可以扩展多个
public class SteadyStrategy implements GameStrategy {
@Override
public void warStrategy() {
System.out.println("猥琐发育...别浪...");
}
}
public class UziStrategy implements GameStrategy{
@Override
public void warStrategy() {
System.out.println("发起进攻.....");
}
}
//Test
public static void main(String[] args) {
TeamGNR gnr = new TeamGNR();
//想要使用哪个策略就传哪个
gnr.setGameStrategy(new RandomStrategy());
gnr.startGame();
}

//环境类
public class SKTTeam {
private TeamState teamState;
public void setTeamState(TeamState teamState) {
this.teamState = teamState;
}
//开始游戏
public void startGame(){
//状态不同会导致不同的游戏结果
teamState.playGame();
}
//下一个状态
void nextState(){
teamState = teamState.next();
}
}
//抽象状态
public interface TeamState {
//玩游戏
void playGame();
//切换到下一个状态
TeamState next();
}
//休息状态
public class VocationState implements TeamState {
@Override
public void playGame() {
System.out.println("休假状态...不想玩游戏");
//状态流转
}
@Override
public TeamState next() {
return new HungerState();
}
}
//饥饿状态
public class HungerState implements TeamState {
@Override
public void playGame() {
System.out.println("肚子饿了...,游戏输了");
}
@Override
public TeamState next() {
return new MatchState();
}
}
//吃饱喝足好好打
public class MatchState implements TeamState{
@Override
public void playGame() {
System.out.println("吃饱喝足...全力以赴打比赛....");
}
//状态模式的核心
@Override
public TeamState next() {
return new VocationState();
}
}
//Test
public static void main(String[] args) {
SKTTeam sktTeam = new SKTTeam();
TeamState state = new VocationState();
sktTeam.setTeamState(state);
sktTeam.startGame();
state = state.next();
sktTeam.setTeamState(state);
sktTeam.startGame();
state = state.next();
sktTeam.setTeamState(state);
sktTeam.startGame();
}

//中介者,塔台
public class ControlTower {
private boolean canDo = true;
//接受请求...
public void acceptRequest(Captain captain,String action){
if("fly".equals(action)||"land".equals(action)){
//
if(canDo == true){
System.out.println("允许......");
canDo = false;
}else {
System.out.println("不允许.....");
}
}
if("success".equals(action)){
canDo = true;
}
}
}
//抽象的机长
public abstract class Captain {
//起飞
abstract void fly();
//降落
abstract void land();
//完成
abstract void success();
}
//来几个飞机
public class HU8778 extends Captain{
ControlTower controlTower;
public void setControlTower(ControlTower controlTower) {
this.controlTower = controlTower;
}
@Override
void fly() {
System.out.println("HU8778请求起飞......");
//问每个机长能否起飞?
controlTower.acceptRequest(this,"fly");
}
@Override
void land() {
System.out.println("HU8778请求降落......");
controlTower.acceptRequest(this,"land");
}
@Override
void success() {
System.out.println("完成......");
controlTower.acceptRequest(this,"success");
}
}
//
public class SC8633 extends Captain{
ControlTower controlTower ;
public void setControlTower(ControlTower controlTower) {
this.controlTower = controlTower;
}
@Override
void fly() {
System.out.println("SC8633 请求起飞......");
//问每个机长能否起飞?
controlTower.acceptRequest(this,"fly");
}
@Override
void land() {
System.out.println("SC8633 请求降落......");
//问每个机长能否起飞?
controlTower.acceptRequest(this,";land");
}
@Override
void success() {
System.out.println("SC8633 完成......");
//问每个机长能否起飞?
controlTower.acceptRequest(this,"fly");
}
}
//Test......
public static void main(String[] args) {
HU8778 hu8778 = new HU8778();
SC8633 sc8633 = new SC8633();
ControlTower tower = new ControlTower();
hu8778.setControlTower(tower);
sc8633.setControlTower(tower);
hu8778.fly();
hu8778.success();
sc8633.fly();
}

//抽象的主播
public abstract class AbstractTikToker {
//添加粉丝
abstract void addFans(AbstractFans fans);
//通知粉丝
abstract void notifyFans(String msg);
}
//抽象观察者、粉丝
public abstract class AbstractFans {
abstract void acceptMsg(String msg);
void follow(AbstractTikToker tikToker){
//主播增粉了
tikToker.addFans(this);
};
}
//真实粉丝
public class HumanFans extends AbstractFans {
@Override
void acceptMsg(String msg) {
System.out.println(msg);
}
}
//机器人
public class RobotFans extends AbstractFans {
@Override
void acceptMsg(String msg) {
System.out.println("这是机器人粉丝");
}
}
//主播直播啦
public class MMTikToker extends AbstractTikToker{
//1、观察者的核心,维护一个列表
List<AbstractFans> fansList = new ArrayList<>();
void start() {
notifyFans("主播上线快来围观吧!!!!!!!");
}
void end() {
notifyFans("本次直播到这里就结束啦!!!!");
}
@Override
void addFans(AbstractFans fans) {
fansList.add(fans);
}
@Override
void notifyFans(String msg) {
//1、所有粉丝拿来通知
for (AbstractFans fans : fansList) {
fans.acceptMsg(msg);
}
}
}
//Test
public static void main(String[] args) {
MMTikToker toker = new MMTikToker();
RobotFans fans1 = new RobotFans();
fans1.follow(toker);
HumanFans humanFans = new HumanFans();
humanFans.follow(toker);
toker.start();
toker.end();
}

//当前游戏信息
public class Gamer {
Integer coin;//剩余金币
Integer hp;//血量
Integer mp;//蓝量
Integer level;//等级
//以上的是内部状态,我们需要记录保存的信息
GameServer gameServer = new GameServer();
//保存游戏记录
void saveGameRecord() throws Exception {
System.out.println("正在保存当前记录....");
GameRecord gameRecord = new GameRecord();
//当前游戏信息保存到备忘录
BeanUtils.copyProperties(gameRecord,this);
gameServer.add(gameRecord);
}
//从备忘录获取游戏历史存档
Gamer getFromMemento(Integer id) throws Exception {
System.out.println("获取历史存档信息....");
Gamer record = gameServer.getRecord(id);
return record;
}
//玩游戏
void playGame(){
int i = new Random().nextInt();
System.out.println("......(〃'▽'〃)......"+i);
coin = i;
hp = i;
mp = i;
level = i;
}
//退出游戏
void exitGame() throws Exception {
System.out.println("退出&存档");
saveGameRecord();
}
}
//备忘录
public class GameRecord {
Integer id; //代表生成记录的id
Integer coin;//剩余金币
Integer hp;//血量
Integer mp;//蓝量
Integer level;//等级
//获取当前备忘录信息
void getCurrent(){
System.out.println("coin:"+coin+";\t"+"hp:"+hp+";\t mp:"+mp);
}
}
//游戏服务器
public class GameServer {
//管理备忘录信息的
Map<Integer,GameRecord> records = new HashMap<>();
int i = 1;
void add(GameRecord gameRecord){
gameRecord.setId(i++);
records.put(gameRecord.id,gameRecord);
}
Gamer getRecord(Integer id) throws Exception {
GameRecord gameRecord = records.get(id);
//获取到备忘录里面的内容以后还要逆转
Gamer gamer = new Gamer();
//BeanUtils:工具类,属性对拷,记得加依赖
BeanUtils.copyProperties(gamer,gameRecord);
return gamer;
}
}
//Test
public static void main(String[] args) throws Exception {
Gamer gamer = new Gamer();
gamer.playGame();
//保存
gamer.saveGameRecord();
Gamer fromMemento = gamer.getFromMemento(1);
fromMemento.playGame();
}

//景区
public class Area {
Set<String> city = new HashSet<>();
Set<String> type = new HashSet<>();
IDCardExpression idCardReader;//读卡器,表达式解析器
public Area(){
//免费人群
city.add("武汉市");
city.add("上海市");
type.add("医生");
type.add("老人");
type.add("儿童");
//最小解析
TerminalExpression city =
new TerminalExpression(this.city, ":");
TerminalExpression type =
new TerminalExpression(this.type, "-");
//以上满足一个即可
idCardReader = new OrExpression(city,type);
}
//传入表达式,判断当前表达式是否指定为免费人群
void getTicket(String expression){
boolean interpret = idCardReader.interpret(expression);
if(interpret){
System.out.println("恭喜你,免票通过....");
}else {
System.out.println("对不起,请2元购票....");
}
}
}
//抽象表达式的解析
public abstract class IDCardExpression {
//定义解析逻辑:城市:姓名-职业
abstract boolean interpret(String expression);
}
//终结符表达式,多少种解析规则就需要定义多少种规则类
public class TerminalExpression extends IDCardExpression {
IDCardExpression childExp;
Set<String> data; //免费数据
String symbol; //定义解析用的符号
public TerminalExpression( Set<String> data,String symbol){
this.data = data;
this.symbol = symbol;
}
@Override
boolean interpret(String expression) {
//按照指定符号分割
String[] split = expression.split(symbol);
boolean result = false;
for (String s : split) {
if(data.contains(s)){
return true;
};//说明是免费的信息里面的
}
//不在免费行列
return false;
}
}
//非终结表达式
public class OrExpression extends IDCardExpression {
//组合两个终结表达式。最终的判断结果是终结表达式判断出来的,这个表达式只是一个桥梁
private IDCardExpression cityExp;
private IDCardExpression typeExp;
public OrExpression(IDCardExpression cityExp, IDCardExpression typeExp) {
this.cityExp = cityExp;
this.typeExp = typeExp;
}
@Override
boolean interpret(String expression) {
//定义所有终结表达式的合并逻辑,符合一个即符合
return cityExp.interpret(expression) || typeExp.interpret(expression);
}
}

//抽象命令类
public interface Command {
void execute();
}
//具体命令
public class ChangeShow implements Command{
//Dao
private Receiver receiver = new Receiver();
@Override
public void execute() {
System.out.println("换台......");
receiver.changeTV();
}
}
//具体命令
public class VoiceUp implements Command{
private Receiver receiver = new Receiver();
@Override
public void execute() {
System.out.println("调大声音....");
receiver.voiceUp();
}
}
//接受者、电视机
public class Receiver {
public void changeTV(){
System.out.println("换台了......");
}
public void voiceUp(){
System.out.println("声音开大了.....");
}
}
//命令调用者(发起者)
public class Invoker {
Command command;
public void call(){
//命令
command.execute();
}
public void setCommand(Command command) {
this.command = command;
}
}
//Test
public static void main(String[] args) {
Invoker invoker = new Invoker();
invoker.setCommand(new VoiceUp());
invoker.call();
}

//抽象容器
public interface Container {
public Iterator getIterator();
}
//抽象迭代器
public interface Iterator {
public boolean hasNext();
public Object next();
}
//具体容器
public class NameRepository implements Container {
public String[] names = {"Robert" , "John" ,"Julie" , "Lora"};
@Override
public Iterator getIterator() {
return new NameIterator();
}
private class NameIterator implements Iterator {
int index;
@Override
public boolean hasNext() {
if(index < names.length){
return true;
}
return false;
}
@Override
public Object next() {
if(this.hasNext()){
return names[index++];
}
return null;
}
}
}
//遍历打印
public class IteratorPatternDemo {
public static void main(String[] args) {
NameRepository namesRepository = new NameRepository();
for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
String name = (String)iter.next();
System.out.println("Name : " + name);
}
}
}

//硬件,抽象元素类
public abstract class Hardware {
String command;//封装硬件的处理指令
public Hardware(String command){
this.command = command;
}
//收到命令以后进行工作
abstract public void work();
//定义接受软件升级包的方法。这个方法应该具体硬件去实现
abstract public void accept(Vistor vistor);
}
//其中的一种硬件
public class CPU extends Hardware{
public CPU(String command) {
super(command);
}
@Override
public void work() {
System.out.println("CPU处理指令:"+command);
}
@Override
public void accept(Vistor vistor) {
//给升级包提供一个改CPU指令等信息的办法
vistor.visitCPU(this);
}
}
//其中的另一种硬件
public class Disk extends Hardware{
public Disk(String command) {
super(command);
}
@Override
public void work() {
System.out.println("Disk保存指令的历史记录:"+command);
}
@Override
public void accept(Vistor vistor) {
vistor.visitDisk(this);
}
}
//小爱机器人
public class XiaoAi {
private CPU cpu = new CPU("今天天气怎么样?");
private Disk disk = new Disk("今天天气怎么样?");
void answerQuestion(){
cpu.work();
disk.work();
}
//接受升级包
public void acceptUpdate(Vistor aPackage) {
//升级CPU
aPackage.visitCPU(cpu);
aPackage.visitDisk(disk);
}
}
//升级包的接口
public interface Vistor {
//访问者能访问元素。
void visitDisk(Disk disk);
void visitCPU(CPU cpu);
}
//真正的升级包,可以更改指令
public class UpdatePackage implements Vistor{
private String ext;
public UpdatePackage(String ext){
this.ext = ext;
}
@Override
public void visitDisk(Disk disk) {
disk.command += " >>> "+ext;
}
@Override
public void visitCPU(CPU cpu) {
//改属性为例
cpu.command += ">>>> "+ext;
}
}
//Test
public class MainTest {
public static void main(String[] args) {
XiaoAi xiaoAi = new XiaoAi();
xiaoAi.answerQuestion();
//升级。cpu联网处理指令
//升级。disk保存到云存储
UpdatePackage aPackage = new UpdatePackage("联网增强功能");
xiaoAi.acceptUpdate(aPackage);
//访问者
xiaoAi.answerQuestion();
}
}

//抽象的Filter接口
public interface Filter {
void doFilter(Request request,Response response,FilterChain chain);
}
//第一个具体的Filter
public class HttpFilter implements Filter{
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
//第一个filter的功能
request.msg+=">>>";
System.out.println("HttpFilter...doFilter之前");
//放行
chain.doFilter(request,response,chain);
System.out.println("HttpFilter...doFilter之后");
}
}
//第二个具体的Filter
public class CharacterFilter implements Filter{
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
//功能
request.msg +=" ====";
System.out.println("CharacterFilter...doFilter之前");
//放行
chain.doFilter(request,response,chain);
System.out.println("CharacterFilter...doFilter之后");
}
}
//第三个具体的Filter
public class EncodingFilter implements Filter{
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.msg+=" oooo";
System.out.println("EncodingFilter...doFilter之前");
//放行
chain.doFilter(request,response,chain);
System.out.println("EncodingFilter...doFilter之后");
}
}
//FilterChain,靠他维护链条
public class FilterChain implements Filter {
//记录当前执行的步骤游标
int cursor = 0;
//filter的链
List<Filter> filtersChain = new ArrayList<>();
//最终要执行的目标方法
MyTarget target;
public void setTarget(MyTarget target) {
this.target = target;
}
public MyTarget getTarget() {
return target;
}
//添加filter
void addFilter(Filter filter){
filtersChain.add(filter);
}
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
//游标小于总数量filter一直往下获取执行
if(cursor < filtersChain.size()){
//第一次执行第一个filter,依次往下
Filter filter = filtersChain.get(cursor);
cursor++;
//执行filter
filter.doFilter(request,response,chain);
}else {
//filter完了,该执行目标方法了
target.hello();
}
}
}
@Data
//请求
public class Request {
String msg; //请求内容
public Request(String msg){
this.msg = msg;
}
}
@Data
//响应
public class Response {
String content;
public Response(String content){
this.content = content;
}
}
public class MyTarget {
void hello(){
System.out.println("调用my.hello()");
}
}
//Test
public static void main(String[] args) {
//先new一个FilterChain
FilterChain chain = new FilterChain();
//(模拟)从web.xml读取filter加入
HttpFilter filter = new HttpFilter();
CharacterFilter characterFilter = new CharacterFilter();
EncodingFilter encodingFilter = new EncodingFilter();
chain.addFilter(filter);
chain.addFilter(characterFilter);
chain.addFilter(encodingFilter);
//目标方法
chain.setTarget(new MyTarget());
//filter链式执行。
chain.doFilter(new Request("hello world"),
new Response("world,world"),chain);
}

代码有点长,耐不下心看可以复制到IDEA调试一下,上边完整代码可运行。
呼~~,终于结束了,感觉这篇有点长了…