人大网站建设的总结百度seo关键词优化工具
一,适配器模式
将一个接口类型转换成客户端所需要的接口类型,将原本不兼容的接口类型转变成兼容的接口类型。生活中用到适配的例子也很多,很贴近的就是电脑电源适配器的例子。电源自然都是我们的生活电源220v电源,但是笔记本电脑是低电压的,电源适配器会把生活电源适配成该电脑型号所需要的电源电压。
适配器模式通过对接口的适配,让客户端统一去调用接口,使得更简单直接,更紧凑。但是也并不是接口代码设计的时候,就想着适配器去设计,适配器模式适用于客户端与开发者接口这边都不好修改的时候或者重新生成的时候,但是为了提高代码的复用性,所以才采用适配器模式。
public abstract class Voltage {private String typeName;public Voltage(){this.typeName = typeName;}public abstract void output22V();
}
public class ComputerI extends Voltage{private String typeName;public ComputerI(String typeName){super();this.typeName =typeName;}@Overridepublic void output22V() {System.out.println("电脑"+typeName+"接收输出电源220v,适配器配置输出为30v");}
}
public class ComputerII extends Voltage{private String typeName;public ComputerII(String typeName){super();this.typeName = typeName;}@Overridepublic void output22V() {System.out.println("电脑"+typeName+"接收输出电源220v,适配器配置输出为31V");}
}
public class Main {public static void main(String[] args) {Voltage v = new ComputerI("computerI");v.output22V();Voltage v2 = new ComputerII("computerII");v2.output22V();}
}
二,备忘录模式
三个成员: 发起备忘者类, 备忘录类 , 管理备忘录类 。发起备忘录者类定义备忘属性,发起备忘方法,显示当前属性,显示备忘类中的属性,回复备忘属性方法。备忘录类仅对当前备忘内容的存取,管理备忘录类来调用备忘录类。可以先看一下以下代码,为备忘录模式整个的调用流程,以游戏存档的作为例子。备忘录模式会消耗你的内存,这里的例子还好,因为备忘录对象的一直存在不被回收,所以备忘的属性就要求做到精简,尽量减少内存的消耗。
//存档发起者类
public class RoleName{private String playerName;private double damage; //攻击力private double defense; //防御力private double Movespeed; //移动速度//存档public Memento newMemento(){return new Memento(this.damage,this.defense,this.Movespeed);}//恢复备忘录public void getMemento(Memento mem){damage = mem.damage;defense = mem.defense;Movespeed = mem.Movespeed;}//显示当前备份的档案public void showMemento(Memento mem){System.out.println("damage==>" + mem.damage +", defense===>" + mem.defense +", Movespeed===>" + mem.Movespeed);}public String getPlayerName() {return playerName;}public void setPlayerName(String playerName) {this.playerName = playerName;}public double getDamage() {return damage;}public void setDamage(double damage) {this.damage = damage;}public double getDefense() {return defense;}public void setDefense(double defense) {this.defense = defense;}public double getMovespeed() {return Movespeed;}public void setMovespeed(double movespeed) {Movespeed = movespeed;}@Overridepublic String toString() {return "RoleName [playerName=" + playerName + ", damage=" + damage+ ", defense=" + defense + ", Movespeed=" + Movespeed + "]";}
}
//备忘录类
public class Memento {public double damage; //攻击力public double defense; //防御力public double Movespeed; //移动速度public Memento(double damage, double defense, double movespeed) {this.damage = damage;this.defense =defense;this.Movespeed = movespeed;}
}
//管理者类
public class ManageMem {private Memento mem;public Memento getMem() {return mem;}public void setMem(Memento mem) {this.mem = mem;}
}
public class Main {public static void main(String[] args) {RoleName rn = new RoleName();rn.setPlayerName("玩家名称");rn.setDamage(11);rn.setDefense(12);rn.setMovespeed(20);ManageMem mamem = new ManageMem();mamem.setMem(rn.newMemento()); //存档rn.showMemento(mamem.getMem()); //显示存档内容System.out.println("================> T—T 号子被洗了");rn.setDamage(0);rn.setDefense(0);rn.setMovespeed(1);System.out.println(rn.toString()); // 洗了号子之后的样子System.out.println("================> 还好存档了,恢复");rn.getMemento(mamem.getMem()); //恢复存档System.out.println(rn.toString());}
}
三,组合模式
现在需要开发一个OA项目,要求该公司以及其分公司,分公司旗下的公司都要统一使用该OA系统,使用一套部门分布相关内容。但是要求对于使用的公司不同,只能看到该公司各个部门的信息。当然不能为每个公司各独自开发一个单独的页面用于显示,重复的页面用于不同的功能这样叫做浪费人力。现在有两种方式,可以通过对人员信息进行公司划分,对于不同的公司,比如总公司的员工为state设置成一,这样去实现一个公司的人员信息查询,但是因为如一张表,其它公司的员工 自然也能查看该表信息,如果不能那么维护则全部交给总公司处理,表访问权限只有总公司。那么另外一种方式就是通过后端代码去树形实现。对于总公司下的分公司,以及分公司旗下的公司作为树枝,每个公司在OA显示上公用的部门模块作为树叶,每片树叶没有其它的分支。
从组合模式的透明方式与安全方式来说。透明方式是通过统一的接口去处理,这里的Leaf与BranComponent继承了同一个抽象类,但是树叶类对于add,remove方法实现是没有意义的,所以为一个提示方法。当然也可以在抽象类减少这两个方法,然后让BranComponent自己去定义这两个方法,这就是安全方式 。但是这样在调用的时候就需要做相应的判断,因为树叶与树枝继承了同一个父类,切有相同的实现,那么在客户端显示的时候,就需要根据判断,来告诉display方法是否需要继续往下去执行,但是树叶节点是不用继续向下的。
public abstract class Component {public String name;public Component(String name){this.name = name;}public abstract void add(Component com);public abstract void remove(Component com);public abstract void diplay(int depth);
}
public class Leaf extends Component {private List<Component> list = new ArrayList<Component>();public Leaf(String name) {super(name);}@Overridepublic void add(Component com) {System.err.println("叶子节点不能添加其它节点");}@Overridepublic void remove(Component com) {System.err.println("叶子节点没有之下的其它节点移除");}@Overridepublic void diplay(int depth) {System.out.println("====>depth" + depth +":" + super.name);}
}
public class BranComponent extends Component {List<Component> list = new ArrayList<Component>();public BranComponent(String name){super(name);}@Overridepublic void add(Component com) {list.add(com);}@Overridepublic void remove(Component com) {list.remove(com);}@Overridepublic void diplay(int depth) {System.out.println("====>depth" + depth +":" + super.name);for(int i=0;i<list.size();i++){Component cp = list.get(i);cp.diplay(depth+1);}}
}
public class Main {public static void main(String[] args) {Component root = new BranComponent("公司总部");root.add(new Leaf("人力资源部"));root.add(new Leaf("公司财务部"));root.add(new Leaf("信息部"));Component comp = new BranComponent("北京分公司");comp.add(new Leaf("北京人力资源部"));comp.add(new Leaf("北京公司财务部"));comp.add(new Leaf("北京信息部"));root.add(comp);Component comp2 = new BranComponent("南京分公司");comp2.add(new Leaf("人力资源部"));comp2.add(new Leaf("公司财务部"));comp2.add(new Leaf("南京信息部"));root.add(comp2);Component comp3 = new BranComponent("隶属北京分公司旗下某公司");comp3.add(new Leaf("旗下某公司人力资源部"));comp3.add(new Leaf("旗下某公司公司财务部"));comp3.add(new Leaf("旗下某公司信息部"));comp.add(comp3);root.diplay(1);}
}