浅析JAVA设计模式(二)
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设计模式(二)的更多相关文章
- 浅析JAVA设计模式之工厂模式(二)
1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- Java 设计模式(二)-六大原则
Java 设计模式(二)-六大原则 单一职责原则(Single Responsibility Principle) 定义: 不要存在多余一个原因导致类变更,既一个类只负责一项职责. 问题由来: 当类A ...
- 浅析JAVA设计模式(一)
第一写技术博客,只是想把自己一天天积累的东西与大家分享.今天在看<大型网站架构和java中间件>这本书时,其中提到代理模式的动态代理.作为java中间件的一个重要基础,我觉的有必要整理和分 ...
- java设计模式(二)---工厂方法模式
2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...
- 浅析JAVA设计模式(三)
4.接口隔离原则: ISP(Interface Segregation Principle) 客户端不应该依赖它不需要的接口,或者说类的依赖的关系应该建立在最小的接口上.举个例子,直接上代码: 1 ...
- 阿里架构师浅析Java设计模式之虚拟代理模式
虚拟代理模式(Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候.在特定的应用中,不同部分的功能由不同的对象组成,应用启动 ...
- 浅析java设计模式(一)----异构容器,可以存储任何对象类型为其他类提供该对象
最近在着手重构一个java UI桌面项目,发现这个项目在一开始的时候由于需求不明确,以及开发人员对swing框架不熟悉等问题造成了页面代码混乱的情况:为了能够在各个类里都可以拿到其他类的引用去进行相应 ...
- Java设计模式二
今天谈的是工厂模式,该模式用于封装和对对象的创建,万物皆对象,那么万物又是产品类,如一个水果厂生产三种水果罐头,我们就可以将这三种水果作为产品类,再定义一个接口用来设定对水果罐头的生成方法,在工厂类中 ...
随机推荐
- chroot 命令实例讲解
我是一个刚接触 Linux 和 Unix 的新手.我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密 ...
- linux文件权限查看及修改-chmod
查看linux文件的权限:ls -l 文件名称 查看linux文件夹的权限:ls -ld 文件夹名称(所在目录) 修改文件及文件夹权限: sudo chmod -(代表类型)×××(所有者)×××(组 ...
- Windows环境下安装Ionic
1. 首先要安装node环境,Ionic的安装和后续的许多前端工具的安装都依赖于node的包管理器npm. nodeJs环境的安装很简单,去官网下载最新版的NodeJs直接安装即可. Nod ...
- ThinkPHP3.1新特性:Action参数绑定
Action参数绑定功能提供了URL变量和操作方法的参数绑定支持,这一功能可以使得你的操作方法定义和参数获取更加清晰,也便于跨模块调用操作方法了.这一新特性对以往的操作方法使用没有任何影响,你也可以用 ...
- TransactionScope 对该事务的状态无效 和一些注意事项
使用TransactionScope 的时候要操作同一种数据库操作方式,不能一个方法用ado.net ,另外一个方法用EF,那样会报 "该事务管理器已经禁止了它对远程/网络事务的支持&quo ...
- 更改Mysql数据库存储位置的具体步骤
首先把mysql的服务先停掉,更改MySQL配置文件My.ini中的数据库存储主路径,将老的数据库存储主路径中的数据库文件和文件夹复制到新的存储主路径,接下来重启搞定 一.首先把mysql的服 ...
- Android中的普通对话框、单选对话框、多选对话框、带Icon的对话框、以及自定义Adapter和自定义View对话框详解
对话框就是一个AlertDialog,但是一个简单的AlertDialog,我们却可以将它玩出许多花样来,下面我们就来一起总结一下AlertDialog的用法.看看各位童鞋在平时的工作中否都用到了Al ...
- C#异常之(已有打开的与此 Command 相关联,已有打开的与此命令相关联的 DataReader,必须首先将它关闭。)
异常提示:“System.InvalidOperationException”类型的异常在 System.Data.dll 中发生,但未在用户代码中进行处理 其他信息: 已有打开的与此 Comman ...
- java.sql.SQLException: Before start of result set
在使用JDBC查询数据库报了这么一个错误 CREATE TABLE `d_user` ( `id` int(10) NOT NULL, `name` varchar(10) DEFAULT NULL, ...
- R-大数据分析挖掘(2-R爬虫)
RCurl作者: