今天睡醒后就拿起《大话设计模式》这本书来看,更是看的一天饭也没吃。我对于设计模式只是一知半解,看了之后感觉受益匪浅。在此做个小笔记。也强烈建议像我这样的萌新去看看。
前言
首先复习一下向对象编程的优点:可维护,可复用,可扩展,灵活性好。
面向对象的好处:(原文)
之后当我学习了面向对象的分析设计编程思想,开始考虑通过封装、继承、多态把程序的耦合度降低,传统印刷术的问题就在于
所有字都刻在同一版面上造成耦合度太高太高所致,开始同设计模式使得程序更加的灵活,容易修改,并且易于复用。
(1).<简单工厂模式>(书本例子:计算器的实现)
主要是利用继承的特性,
父类对象的引用指向一个子类的对象。
工厂根据输入要求,实例化出合适的子类对象返回给父类。
public class AnimalFactory { private Animal anima; public Animal getAnimal(String name) { if(name.equals("cat")) { anima = new Cat();//继承Animal类 } else { anima = new Dog();//继承Animal类
}
return anima; }
}
//使用AnimalFactory工厂获取实例对象 Animal anima = AnimalFactory.getAnimal("cat"); //调用anima的方法
anima.yell();
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
(2).<策略模式Strategy>(书本例子:商场收银软件)
定义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
策略上下文 类
public class StrategyContext { private Method method; public StrategyContext(Method method) {//抽象策略类 this.method = method; } public String getTotle() { method.getTotleMoney();//不同的实现类有不同的算法 } }
客户端调用
StrategyContext methodContext = null; if(?) { methodContext = new StrategyContext(new CashNormal());//CashNormal继承了Method抽象策略类 } else { methodContext = new StrategyContext(new CashRebate());//CashRebate继承了Method抽象策略类 } animaContext.getTotleMoney();//算法
策略模式经常与简单工厂模式一起使用
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是具体实现不同,他可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合
策略模式封装了变化
(3).<装饰模式Decorator>(书本例子:怎么穿衣打扮)
定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
类似与一个对象调用链。所有Decorator类都继承同一个类。
public class PersonA extends Person{ private Person component; public void decorate(Person component) { this.component = component; } @Override public void show() { System.out.println("PersonA: 在装饰类的show方法多加一句打印"); component.show(); } }
Person p1 = new Person(); PersonA p2 = new PersonA(); PersonB p3 = new PersonB(); p2.decorate(p1); p3.decorate(p2); p3.show();
(4).<代理模式Proxy>(书本例子:替别人送情书)
定义:为其他对象提供一种代理以控制对这个对象的访问 。
代理类 和 被代理类 实现同一个主题接口,
代理类中包含被代理类的实例,其他类调用代理类的代理方法
public class PersonA extends Person{ private PersonB personB; @Override public void proxy() { if(personB == null) { personB = new PersonB(); } personB.proxy(); } }
应用场景:
1.远程代理,也就是为一个对象在不同的地址空间提供局部代理。这样可以隐藏一个对象存在于不同地址空间的事实。
2.虚拟代理,根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
3.安全代理,用来控制真实对象访问时的权限,一般用于对象应该有不同的访问权限的时候。
4.智能指引,是指当调用真实的对象时,代理处理另外一些事。
(4).<工厂方法模式>(书本例子:学雷锋做好事)
定义:
设计原则:
(1)单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原则。
接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。
(2)开放-封闭原则(OCP):就说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。
对于扩展是开放的,对于更改是封闭的
怎样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?