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. Eclipse的下载、安装和WordCount的初步使用(本地模式和集群模式)

    包括:    Eclipse的下载 Eclipse的安装 Eclipse的使用 本地模式或集群模式 Scala IDE for Eclipse的下载.安装和WordCount的初步使用(本地模式和集群 ...

  2. A Tour of Go If and else

    Variables declared inside an if short statement are also available inside any of the else blocks. pa ...

  3. js常用内置对象、Dom对象、BOM对象

    11.html元素事件属性中,如onclick="",双引号里可以是方法条用,可以是js代码(无需加<script>标签) 12.JavaScript内置 对象.属性和 ...

  4. css3水平翻转

    @keyframes cardFront { 0%, 40%, 100% { 02     opacity:1; 03     -webkit-transform:rotateY(0deg); 04 ...

  5. zabbix邮件报警脚本

    #!/usr/bin/python #coding:utf-8 import smtplib from email.mime.text import MIMEText import sys mail_ ...

  6. js 数组详解(javascript array)

    Array Array 对象用于在单个的变量中存储多个值. 构造函数: 1)   new Array(); 2)   new Array(size); 3)   new Array(element0, ...

  7. 在配置XML时报的The reference to entity "dataSource" must end with the ';' delimiter错误

    <?xml version="1.0" encoding="UTF-8"?> <ECharts> <element>http ...

  8. 【Android】BroadCast广播机制应用与实例

    如何编写广播接收器 第一步:需要继承BroadcastReceiver类,覆写其中的onReceive()方法. class MyBroadcastReceiver extends Broadcast ...

  9. PHP获取客户端和服务器IP地址

    /** * 获取客户端IP地址 * @return string */ function get_client_ip() { if(getenv('HTTP_CLIENT_IP')){ $client ...

  10. vim: 自己定义颜色主题(colorscheme)

    命令模式下输入 :hi[ghlight] 能够看到当前vim的着色风格 命令模式下输入 :sy[ntax] 能够看到当前语法加亮模式,当文档的文字与列表里的正則表達式匹配时,vim会给文字着色.应用缩 ...