2. 里氏替换原则:LSP(Liskov Substitution Principle)里氏替换原则,定义为只要父类出现的地方子类就可以出现,而且用子类替换后,程序也不会出现问题,使用者根本不用关心是父类还是子类。这也是我们java继承特性的一个表现。

下面用个实际项目中遇到的一个简单的需求:现在有A类产品需要调用method1(),B类产品也需要调用method(),同样C类产品也需要调用method(),但是我们需要直接让D这个人去处理这个Method(),那么我们可以这样设计一个抽象类AbstractB(或者接口)。

AbstractB类代码如下:

 public abstract class AbstractB {
//实现逻辑
public abstract void Method();
}

下面A,B,C类分别继承抽象类AbstractB:

 public class A extends AbstractB {

     @Override
public void Method() {
System.out.println("A实现Method....");
} }
public class B extends AbstractB {

    @Override
public void Method() {
System.out.println("B实现Method....");
} }
public class C extends AbstractB {

    @Override
public void Method() {
System.out.println("C实现Method....");
} }

设计D类

 @SuppressWarnings("unused")
public class D { public AbstractB abstractObj; public void setRealObj(AbstractB realObj){
this.abstractObj = abstractObj;
} public void invocateMethod(){
//方法调用
abstractObj.Method();
}
}

注意:在类中调用其他类对象的时候,必须要使用父类或者接口,如果没有的话,则说明违背了LSP原则。

写个测试类:

 public class test {

     public static void main(String[] aa){
D d = new D();
d.setRealObj(new A());
/*d.setRealObj(new B());
d.setRealObj(new C());*/
d.invocateMethod();
} }

上面的setRealObj方法中,传递一个子类实体,这里制定的是父类类型,这里我们不用关心传递的是父类还是子类。相反如果参数类型为子类,传递的一个父类的类型,这时就不一定适用。就与里氏替换原则违背,如果现在有个E产品也需要实现Method方法,只需再实现抽象类AbstractB即可。

里氏替换原则的目的就在于增强程序的健壮性,便于系统的兼容性。及时增加子类也可以很好的满足要求继续执行。

3、依赖倒转原则:DIP(Dependence Inversion Principle)这个是开闭原则的基础,具体内容:面向接口编程(OOD),依赖于抽象而不依赖于具体,用到具体类时,不与具体类交互,而与具体类的上层接口或者抽象类交互

这个其实与LSP挺相似的。都是尽量与上层交互。看段代码说话。

比如说司机开汽车,车子有宝马,有奔驰,有其他的型号的汽车。

定一个司机接口Driver

 public interface IDriver {
public void drive();//开车
}

定义一个汽车接口Car

 public interface ICar {
public void run();//汽车奔跑
}

定义宝马,奔驰实现汽车接口

 public class Benz implements ICar {

     @Override
public void run() {
System.out.println("奔驰跑起来....");
} }
public class Bmw implements ICar {

    @Override
public void run() {
System.out.println("宝马跑起来....");
}
}

实现司机接口:

  public class Driver implements IDriver {

      public ICar car;
//这里用构造函数传递依赖对象
public Driver(ICar _car){
this.car = _car;
}
@Override
public void drive() {
this.car.run();
} }

实现依赖注入还有另外两种方式。seter方法注入、接口声明传递。

依赖倒置本质就是通过抽象类或接口实现各个类或者模块彼此独立化,实现模块间的松耦合。我们尽量遵循以下几点:

第一:每个类尽量都有接口或者抽象类或者两者都有。

第二:变量的表面类型尽量是接口或者抽象类。

第三:尽量不要具体类派生,尽量不要复写基类的方法。

第四:结合里氏替换原则使用。个人感觉两者其实意义上有很大的相同。

通俗的讲,倒置的概念我认为就是用抽象代替细节实在,这就是倒置。

浅析JAVA设计模式(二)的更多相关文章

  1. 浅析JAVA设计模式之工厂模式(二)

    1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...

  2. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  3. Java 设计模式(二)-六大原则

    Java 设计模式(二)-六大原则 单一职责原则(Single Responsibility Principle) 定义: 不要存在多余一个原因导致类变更,既一个类只负责一项职责. 问题由来: 当类A ...

  4. 浅析JAVA设计模式(一)

    第一写技术博客,只是想把自己一天天积累的东西与大家分享.今天在看<大型网站架构和java中间件>这本书时,其中提到代理模式的动态代理.作为java中间件的一个重要基础,我觉的有必要整理和分 ...

  5. java设计模式(二)---工厂方法模式

    2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...

  6. 浅析JAVA设计模式(三)

    4.接口隔离原则: ISP(Interface Segregation Principle)  客户端不应该依赖它不需要的接口,或者说类的依赖的关系应该建立在最小的接口上.举个例子,直接上代码:  1 ...

  7. 阿里架构师浅析Java设计模式之虚拟代理模式

    虚拟代理模式(Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候.在特定的应用中,不同部分的功能由不同的对象组成,应用启动 ...

  8. 浅析java设计模式(一)----异构容器,可以存储任何对象类型为其他类提供该对象

    最近在着手重构一个java UI桌面项目,发现这个项目在一开始的时候由于需求不明确,以及开发人员对swing框架不熟悉等问题造成了页面代码混乱的情况:为了能够在各个类里都可以拿到其他类的引用去进行相应 ...

  9. Java设计模式二

    今天谈的是工厂模式,该模式用于封装和对对象的创建,万物皆对象,那么万物又是产品类,如一个水果厂生产三种水果罐头,我们就可以将这三种水果作为产品类,再定义一个接口用来设定对水果罐头的生成方法,在工厂类中 ...

随机推荐

  1. Codeforces149E - Martian Strings(KMP)

    题目大意 给定一个字符串T,接下来有n个字符串,对于每个字符串S,判断是否存在T[a-b]+T[c-d]=S(1 ≤ a ≤ b < c ≤ d ≤ length(T)) 题解 对于每个字符串S ...

  2. Google Code Jam 第一题

    通过的第一题,留做纪念,呵呵,非常简单,Africa 2010, Qualification Round: Store Credit. #include <stdio.h> #includ ...

  3. Java RMI之介绍

    http://zh.wikipedia.org/wiki/Java_RMI Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里, ...

  4. android105 jni概念

    JNI(Java Native Interface,JAVA原生接口) ,通过JNIjava代码可以调用C代码,JNI在安卓中用的很多.安卓中的框架层就是用过JNI访问类库层的.Iphone是用C/C ...

  5. 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据

    瀑布流加载显示数据,在当下已经用的很普遍,尤其是我们在做网上商城时,在产品列表页面已经被普遍使用. 对于实现瀑布流布局的解决方案主要有以下两种方式: 1.对每一条显示数据使用绝对定位+浮动的方式,这样 ...

  6. 集合练习——Map部分

    练习: 输入诗的名称查询出诗的内容,当输入exit时,退出程序,“春晓”,“静夜思”,“鹅”. package CollectionPart; public class Poetry { privat ...

  7. 深入理解计算机系统第二版习题解答CSAPP 2.2

    填写空白项. n 2n(十进制) 2n(十六进制) 9 512 0x200 19 0x80000 16384 0x4000 0x10000 17 0x20000 32 0x20 0x80

  8. 【排障】每次打开word都提示要安装配置

    为什么每次打开word都提示要安装配置?很多人在打开word时,总是提示要安装配置一遍,花去不少时间,这是由于电脑里有两个不同版本的office软件,产生的原因可能是原来的卸载了没卸载干净,或是安装了 ...

  9. ArrayList的深度copy和浅度拷贝

    ArrayList的浅度拷贝方式: 通过Collections.copy方法实现浅度拷贝 ArrayList<GuideGroup> questionGuideGroupList = ne ...

  10. 循环json里面的数据

    {{each company as cvalue i}}   {{each value.Goods as gvalue i}}   {{each gvalue.SKU as value i}}     ...