概述
1 简单工厂模式
抽象出子类对象,父类对象
创建一个工厂类,实例化出对应的对象
public class StaticFactoryMethod {
class OperationFactory {
public Operation createOperate(String operate) {
switch (operate) {
case "+":
return new OperationAdd();
case "-":
return new OperationSub();
}
return new Operation();
}
}
2 策略模式
定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户。
策略模式就是用来封装算法的,它来几乎封装任何类型的规则,只要在分析过程中意识到需要在不同的时间应用不同的业务规则,就可以考虑使用策略模式。
public class StrategyPattern {
public static void main(String[] args) {
Context context;
context = new Context(new ConcreteStrategyA());
context.contextInterface();
}
}
abstract class Strategy {
public abstract void algorithmInterface();
}
class ConcreteStrategyA extends Strategy {
@Override
public void algorithmInterface() {
System.out.println("算法a实现");
}
}
class ConcreteStrategyB extends Strategy {
@Override
public void algorithmInterface() {
System.out.println("算法B实现");
}
}
class ConcreteStrategyC extends Strategy {
@Override
public void algorithmInterface() {
System.out.println("算法C实现");
}
}
class Context {
Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void contextInterface() {
strategy.algorithmInterface();
}
}
3 单一职责原则(SRP)
就一个类而言,应该仅有一个引起他变化的原因
4 开放-封闭原则(OCP)
软件实体(类/模块/函数等等)可以拓展,但是不可修改。
5 依赖倒转原则
高层模块不应该依赖低层模块,两个都应该依赖抽象。
抽象不应该依赖细节,细节应该依赖抽象。
里氏代换原则(LSP)子类型必须能够替换掉他们的父类型。
6 装饰模式
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
public class DecoratorPattern {
public static void main(String[] args) {
Person sc = new Person("小菜");
System.out.println("第一种装扮");
BigTrouser kk = new BigTrouser();
Tshirts dtx = new Tshirts();
kk.Decorate(sc);
dtx.Decorate(kk);
dtx.show();
}
}
class Person {
public Person() {
}
private String name;
public Person(String name) {
this.name = name;
}
public void show() {
System.out.println("装扮的" + name);
}
}
class Finery extends Person {
protected Person component;
public void Decorate(Person component) {
this.component = component;
}
@Override
public void show() {
if (component != null)
component.show();
}
}
class Tshirts extends Finery {
@Override
public void show() {
System.out.println("大 T shirts");
super.show();
}
}
class BigTrouser extends Finery {
@Override
public void show() {
System.out.println("垮裤");
super.show();
}
}
7 代理模式
为其他对象提供一种代理以控制对这个对象的访问。
应用:
1 远程代理,为一个对象在不同的地址空间提供局部代表,可以隐藏一个对象存在于不同地址空间的事实。
2 虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。
3 安全代理,用来控制真实对象访问的权限。
4 智能指引,当调用真实的对象时,代理处理另外一些事。
public class ProxyPattern {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request();
}
}
abstract class Subject {
public abstract void request();
}
class RealSubject extends Subject {
@Override
public void request() {
System.out.println("真实的请求");
}
}
class Proxy extends Subject {
RealSubject realSubject;
@Override
public void request() {
if(realSubject==null)
realSubject=new RealSubject();
realSubject.request();
}
}
8 工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延长至其子类。
public class FactoryMethodPattern {
public static void main(String[] args) {
IFactory iFactory = new UndergraduateFactory();
LeiFeng student = iFactory.createLeiFeng();
student.buyRice();
student.sweep();
student.wash();
}
}
class LeiFeng {
public void sweep() {
System.out.println("扫地");
}
public void wash() {
System.out.println("洗衣");
}
public void buyRice() {
System.out.println("买米");
}
}
class Undergraduate extends LeiFeng {
}
class Volunteer extends LeiFeng {
}
interface IFactory {
LeiFeng createLeiFeng();
}
class UndergraduateFactory implements IFactory {
@Override
public LeiFeng createLeiFeng() {
return new Undergraduate();
}
}
class VolunteerFactory implements IFactory {
@Override
public LeiFeng createLeiFeng() {
return new Volunteer();
}
}
9 原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
public class PrototypePattern {
public static void main(String[] args) {
Resume a = new Resume("大鸟");
a.setPersonalInfo("男", "29");
a.setWorkExperience("1998-2000", "xx公司");
Resume b = (Resume) a.clone();
b.setWorkExperience("1998-2006", "yy企业");
Resume c = (Resume) a.clone();
b.setWorkExperience("1998-2003", "zz企业");
a.display();
b.display();
c.display();
}
}
class Resume implements Cloneable {
private String name;
private String sex;
private String age;
private WorkExperience work;
public Resume(String name) {
this.name = name;
work = new WorkExperience();
}
private Resume(WorkExperience work) {
this.work = (WorkExperience) work.clone();
}
public void setPersonalInfo(String sex, String age) {
this.sex = sex;
this.age = age;
}
public void setWorkExperience(String workDate, String company) {
work.setWorkDate(workDate);
work.setCompany(company);
}
public void display() {
System.out.println(name + "," + sex + "," + age);
System.out.println("工作经历:" + work.getWorkDate() + "," + work.getCompany());
}
@Override
public Object clone() {
Resume obj = new Resume(this.work);
obj.name = this.name;
obj.sex = this.name;
obj.age = this.age;
return obj;
}
}
class WorkExperience implements Cloneable {
private String workDate;
public String company;
public String getWorkDate() {
return workDate;
}
public void setWorkDate(String workDate) {
this.workDate = workDate;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Override
protected Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return new Object();
}
}
10 模板方法模式
定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
public class TemplateMethodPattern {
public static void main(String[] args) {
AbstractClass c;
c = new ConcreteClassA();
c.templateMethod();
c = new ConcreteClassB();
c.templateMethod();
}
}
abstract class AbstractClass {
public abstract void primitiveOperation1();
public abstract void primitiveOperation2();
public void templateMethod() {
primitiveOperation1();
primitiveOperation2();
}
}
class ConcreteClassA extends AbstractClass {
@Override
public void primitiveOperation1() {
System.out.println("具体类A 方法1实现");
}
@Override
public void primitiveOperation2() {
System.out.println("具体类A 方法2实现");
}
}
class ConcreteClassB extends AbstractClass {
@Override
public void primitiveOperation1() {
System.out.println("具体类B 方法1实现");
}
@Override
public void primitiveOperation2() {
System.out.println("具体类B 方法2实现");
}
}
11 迪米特法则
最少知识原则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
12 外观模式
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
13 建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。
14 观察者模式
发布-订阅(Publicsh/Subscribe)模式
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
15 抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
优点:易于交换产品系列,让具体的创建实例过程与客户端分离,客户端是通过他们的抽象接口操作实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
缺点:更改一处,多个类都需要更改。
解决:反射+抽象工厂
16 状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
优点:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
当一个对象的行为取决于它的状态,并且它必须在运行时时刻根据状态改变它的行为时,就可以考虑使用状态模式。
17 适配器模式
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
18 备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样可以在以后可将该对象恢复到原先保存的状态。
备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,originator可以根据保存的memento信息还原到前一状态。
19 组合模式
将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
使用场景:需求中是体现部分与整体层次的结构时,希望用户可以忽略组合对象和单个对象的不同,统一的使用组合结构中的所有对象时,就应考虑使用组合模式。
20 迭代器模式
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴漏该对象的内部表示。
使用场景:需要对聚集有多种方式的遍历时
21 单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
22 桥接模式
将抽象部分与他的实现部分分离,使他们都可以独立的变化。
合成/聚合复用原则
尽量使用合成/聚合,尽量不要使用类继承。
23 命令模式
讲一个请求封装为一个对象,从而使你不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
24 责任链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
25 中介者模式
用一个中介对象来封装一系列的对象交互。中介者使对象不需要显式地相互引用,从而使其耦合松散,并且可以独立的改变它们之间的交互。
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合。比如定制一个分布在多个类中的行为,而又不想生成太多子类的场合。
26 享元模式
运用共享技术有效的支持大量细粒度的对象。
使用场景:1 如果一个应用程序使用了大量对象,而大量的这些对象造成了很大的存储开销时;2 对象的大部分状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
public class FlyweightPattern {
public static void main(String[] args) {
int extrinsicstate = 22;
FlyweightFactory f = new FlyweightFactory();
Flyweight fx = f.getFlyweight("x");
fx.operation(--extrinsicstate);
Flyweight fy = f.getFlyweight("y");
fx.operation(--extrinsicstate);
Flyweight fz = f.getFlyweight("z");
fx.operation(--extrinsicstate);
UnshareConcreteFlyweight uf = new UnshareConcreteFlyweight();
uf.operation(--extrinsicstate);
}
}
abstract class Flyweight {
public abstract void operation(int extrinsicstate);
}
class ConcreteFlyweight extends Flyweight {
@Override
public void operation(int extrinsicstate) {
System.out.println("具体Flyweight:" + extrinsicstate);
}
}
class UnshareConcreteFlyweight extends Flyweight {
@Override
public void operation(int extrinsicstate) {
System.out.println("不共享的具体Flyweight:" + extrinsicstate);
}
}
class FlyweightFactory {
private Hashtable flyweight = new Hashtable();
public FlyweightFactory() {
flyweight.put("x", new ConcreteFlyweight());
flyweight.put("y", new ConcreteFlyweight());
flyweight.put("z", new ConcreteFlyweight());
}
public Flyweight getFlyweight(String key) {
return (Flyweight) flyweight.get(key);
}
}
27 解释器模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
当有一个语言需要解释执行,并且你可以将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。
public class InterpreterPattern {
public static void main(String[] args) {
ContextInterpreter context = new ContextInterpreter();
List<AbstractExpression> list = new ArrayList<AbstractExpression>();
list.add(new TerminalExpression());
list.add(new NotterminalExpression());
list.add(new TerminalExpression());
list.add(new TerminalExpression());
for (AbstractExpression exp : list) {
exp.interpret(context);
}
}
}
abstract class AbstractExpression {
public abstract void interpret(ContextInterpreter content);
}
class TerminalExpression extends AbstractExpression {
@Override
public void interpret(ContextInterpreter content) {
System.out.println("终端解释器");
}
}
class NotterminalExpression extends AbstractExpression {
@Override
public void interpret(ContextInterpreter content) {
System.out.println("非终端解释器");
}
}
class ContextInterpreter {
private String input;
private String output;
public String getOutput() {
return output;
}
public String getInput() {
return input;
}
public void setOutput(String output) {
this.output = output;
}
public void setInput(String input) {
this.input = input;
}
}
28 访问者模式
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
适用场景:系统有比较稳定的数据结构,又有易于变化的算法
优点:增加新的操作很容易
缺点:增加新的数据结构困难
public class VisitorPattern {
public static void main(String[] args) {
ObjectStructure o = new ObjectStructure();
o.attach(new ConcreteElementA());
o.attach(new ConcreteElementB());
ConcreteVisitor1 v1 = new ConcreteVisitor1();
ConcreteVisitor2 v2 = new ConcreteVisitor2();
o.accept(v1);
o.accept(v2);
}
}
abstract class Visitor {
public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}
class ConcreteVisitor1 extends Visitor {
@Override
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println(concreteElementA.getClass().getName() + "被" + this.getClass().getName() + "访问");
}
@Override
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getName() + "被" + this.getClass().getName() + "访问");
}
}
class ConcreteVisitor2 extends Visitor {
@Override
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println(concreteElementA.getClass().getName() + "被" + this.getClass().getName() + "访问");
}
@Override
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getName() + "被" + this.getClass().getName() + "访问");
}
}
abstract class Element {
public abstract void accept(Visitor vistior);
}
class ConcreteElementA extends Element {
@Override
public void accept(Visitor vistior) {
vistior.visitConcreteElementA(this);
}
public void operationA() {
}
}
class ConcreteElementB extends Element {
@Override
public void accept(Visitor vistior) {
vistior.visitConcreteElementB(this);
}
public void operationB() {
}
}
class ObjectStructure {
private List<Element> elements = new ArrayList<Element>();
public void attach(Element element) {
elements.add(element);
}
public void detach(Element element) {
elements.remove(element);
}
public void accept(Visitor visitor) {
for (Element e : elements) {
e.accept(visitor);
}
}
}
最后
以上就是坦率鞋垫为你收集整理的大话设计模式的全部内容,希望文章能够帮你解决大话设计模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复