使程序拥有更好的的
设计模式的原则:设计“设计模式”时,遵守的原则,这样设计的依据
即一个类只负责一个职责,如有多个职责应分为多个类
一个类对另一个类的依赖应当建立在最小接口上
如存在一个接口Interface1存在4个方法a()、b()、c()、d(),它有一个实现类Impl1实现了它的四个方法。现存在类Class1需要使用接口中的b()和c()方法,即Class1依赖与Interface1,使用uml类图表示如图
Interface1
a()
b()
c()
d()
Impl1
Class1
对于实现类Impl1来说,a()和d()方法没有被使用,可以无需实现,却必须要书写。此时出现代码的冗余。根据接口隔离原则,可以将Interface1接口进行拆分
此时如果有另一个类需要使用b()、c()、d()三个方法时,需要将上图中的Interface2再拆分一次
Interface2
至此,ClassA对ImplA的依赖,ClassB对ImplB的依赖,建立在最小接口上
ClassA
ImplA
ClassB
ImplB
例1:打印出来源的信息
不遵守依赖倒转原则的写法
public class RawDependenceReversal { public static void main(String[] args) { Person p = new Person(); p.receive(new Email()); }}class Email{ public String getInfo(){ return "电子邮件信息"; }}class Person{ public void receive(Email e){ System.out.println(e.getInfo()); }}
public class RawDependenceReversal {
public static void main(String[] args) {
Person p = new Person();
p.receive(new Email());
}
class Email{
public String getInfo(){
return "电子邮件信息";
class Person{
public void receive(Email e){
System.out.println(e.getInfo());
此时,若Person类可以接收的来源不只是Email,还需要添加其他来源时,会比较麻烦。
Person
遵守依赖倒转原则进行改进:
public class ImproveDependenceReversal { public static void main(String[] args) { Persons p = new Persons(); p.receive(new Emails()); p.receive(new WeChat()); }}interface Sender{ public String getInfo();}class Emails implements Sender{ @Override public String getInfo(){ return "电子邮件信息"; }}class WeChat implements Sender{ @Override public String getInfo() { return "微信信息"; }}class Persons{ public void receive(Sender e){ System.out.println(e.getInfo()); }}
public class ImproveDependenceReversal {
Persons p = new Persons();
p.receive(new Emails());
p.receive(new WeChat());
interface Sender{
public String getInfo();
class Emails implements Sender{
@Override
class WeChat implements Sender{
public String getInfo() {
return "微信信息";
class Persons{
public void receive(Sender e){
依赖倒转的使用方式示例\
方式1:使用接口方式来进行依赖(调用方法时使用接口作为参数)。此时,依赖的是接口而不是细节类,因此符合依赖倒转原则
interface IOpenAndClose{ void open(ITV tv);}class OpenAndClose implements IOpenAndClose{ @Override public void open(ITV tv) { tv.play(); }}interface ITV{ void play();}
interface IOpenAndClose{
void open(ITV tv);
class OpenAndClose implements IOpenAndClose{
public void open(ITV tv) {
tv.play();
interface ITV{
void play();
方式2:通过构造方法来进行依赖
interface IOpenAndClose{ void open();}interface ITV{ void play();}class OpenAndClose implements IOpenAndClose{ public ITV tv; public OpenAndClose(ITV tv){ this.tv = tv; } @Override public void open() { this.tv.play(); }}
void open();
public ITV tv;
public OpenAndClose(ITV tv){
this.tv = tv;
public void open() {
this.tv.play();
方式3:通过setter方法来进行依赖
interface IOpenAndClose{ void open(); public void setTv(ITV tv);}interface ITV{ void play();}class OpenAndClose implements IOpenAndClose{ private ITV tv; @Override public void open() { this.tv.play(); } @Override public void setTv(ITV tv) { this.tv = tv; }}
public void setTv(ITV tv);
private ITV tv;
public void setTv(ITV tv) {
注意事项和细节
public
23种分为三大类
创建型模式
单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式
结构型模式
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式
行为型模式
模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式
原文链接:http://www.cnblogs.com/Weihaom/p/14234985.html
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728