java设计模式--六大原则
一、单一职责原则
单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。通俗来说,就是互相不相关的属性和方法不要放在一个类中,就好比之前简单工厂模式中介绍的那样,客户端(Customer)应该与工厂(Factory)建立成两个类,当客户想要工厂中的另一种产品时,只需要修改客户端,再或者,工厂想要生产新产品,就只需在工厂类中添加,客户端的类而不需修改。这种只有一个动机的去改变一个类就是单一职责原则。
//产品接口
public interface Product { void run(); } public class Car implements Product {
@Override
public void run() {
System.out.println("drive car");
}
} public class Bicycle implements Product {
@Override
public void run() {
System.out.println("ride on a bicycle");
}
}
//工厂类
public class Factory {
public static Product createProduct(String productName){
Product product = null;
switch (productName){
case "car":
product = new Car();
break;
case "bicycle" :
product = new Bicycle();
break;
}
return product;
}
}
//客户端
public class Customer {
public static void main(String[] args) {
Product car = Factory.createProduct("car");
car.run();
Product bicycle = Factory.createProduct("bicycle");
bicycle.run();
}
}
二、里氏替换原则
里氏替换原则:子类型必须能够替换掉它们的父类型。其实就是在一个程序里,某一个地方使用的是一个父类,那么把父类换成它的子类同样适用。另外子类一般不该重写父类的方法,因为父类的方法一般都是对外公布的接口,是具有不可变性的,你不该将一些不该变化的东西给修改掉。因为一般我们认为,父类可以完成的事情,子类也可以,如果重写父类的方法并且因此出错,将来如果用子类替换父类就会出现问题。
三、依赖倒转原则
1.高层模块不应该依赖低层模块,两个都应该依赖抽象
2.抽象不应该依赖细节,细节应该依赖抽象
通俗来说就是依赖接口编程,就比如上面的简单工厂的例子,我们修改一下使其更直观一些,如果没有Product这个接口(如下所示),我们就必须去调用car.run(),此时必须传入一个Car对象,那么如果以后我们不想用Car想用Bicycle或者其他交通工具呢,那就得新增多个Drive类,所以最好的方法是建立一个Product接口,让所有产品都去实现这个接口,这样,客户端也不必去关心从哪个Drive类中获取所需要的run()方法,直接将想用的交通工具传进工厂类Factory中就可以了。
public class Car {
public void run() {
System.out.println("drive car");
}
} public class Drive{
public static void goHome(Car car){ car.run();
}
} public class Customer {
public static void main(String[] args) {
Car car = new Car();
Drive.goHome(car); }
}
四、接口隔离原则
接口隔离原则:一个接口的行为应该尽可能的小,其实就是接口里的方法一定要是所有实现这个接口的类所能实现的。比如我们定义了一个Car接口,里面有两个方法,驾驶和导航,但是实际情况是并不是所有的汽车都有导航的功能,这样的话没有导航功能的汽车实现这个接口的时候就只能把导航的这个方法空着,所以我们最好把navigation()这个方法从这个接口中去掉,另外单独写一个接口。
public interface Car { //行驶
void run();
//导航
void navigation(); }
public class Car1 implements Car {
@Override
public void run() {
System.out.println("Car1 run ....");
} @Override
public void navigation() { }
}
public class Car2 implements Car {
@Override
public void run() {
System.out.println("Car2 run ...");
} @Override
public void navigation() {
System.out.println("Car2 navigation");
}
}
修改后
public interface CarRun {
//行驶
void run();
} public interface CarNavigation {
//导航
void navigation();
} public class Car1 implements CarRun {
@Override
public void run() {
System.out.println("Car1 run ....");
}
} public class Car2 implements CarRun,CarNavigation {
@Override
public void run() {
System.out.println("Car2 run ...");
} @Override
public void navigation() {
System.out.println("Car2 navigation");
}
}
五、迪米特法则
迪米特法则:如果两个类不比彼此直接通信,那么他们就不应该直接发生作用,它强调的是松耦合,这样的话一个类修改也不会对其他类有太大的影响。
看如下实例有三个类,Car(汽车),Driver(司机),Customer(顾客)和一个测试类,可以看到Customer类中new了一个Car,这就违反了迪米特法则,因为驾驶汽车的活应该交由司机处理,Car类应该是司机内部的类
public class Car {
public void run(){
System.out.println("汽车启动...");
}
} public class Driver {
public void driveCar(Car car){
System.out.println("司机已就绪...");
car.run();
}
} public class Customer {
public void goHome(Driver driver){
Car car = new Car();
driver.driveCar(car);
}
} public class test {
public static void main(String[] args) {
Customer customer = new Customer();
customer.goHome(new Driver());
}
}
修改后的类为
public class Customer {
public void goHome(Driver driver){
driver.driveCar();
}
} public class Driver { Car car = null;
public Driver(Car car){
this.car = car;
}
public void driveCar(){
System.out.println("司机已就绪...");
car.run();
}
} public class test {
public static void main(String[] args) {
Customer customer = new Customer();
Car car = new Car();
customer.goHome(new Driver(car));
}
}
这样的话,Customer就不会知道Car实现的细节,全权交由Driver处理。
六、开放-封闭原则
开放-封闭原则:就是类,函数等应该是可以扩展,但是不能修改。这个原则有两个特征,对于扩展是开放的,对于更改是关闭的。但是事实情况是模块不可能完全封闭的,总会有一些变化,但是这时就需要我们去预测可能发生的变化,然后构造抽象来隔离哪些变化,这样的话以后更改起来就可以保持相对稳定,使一个地方的变化对其他地方的影响尽可能的小。
java设计模式--六大原则的更多相关文章
- Java设计模式六大原则-2
Java设计模式六大原则-2 做Java程序开发的每天都在使用JDK,Spring,SpringMvc,Mybatis,Netty,MINA等框架,但很少有人懂得背后的原理.即使打开跟下原码也是一头雾 ...
- Java设计模式六大原则-1
Java设计模式六大原则-1 做Java程序开发的每天都在使用JDK,Spring,SpringMvc,Mybatis,Netty,MINA等框架,但很少有人懂得背后的原理.即使打开跟下原码也是一头雾 ...
- Java设计模式六大原则
一.单一职责原则 单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小.单一职责原则定义如下: 单一职责原则(Single Responsibility Principle, SRP):一个 ...
- Java设计模式六大原则之场景应用分析
定义:不要存在多于一个导致类变更的原因. 通俗的说.即一个类仅仅负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而须要改动类T时,有可能会导致原本执行正 ...
- GOF提出的23种设计模式是哪些 设计模式有创建形、行为形、结构形三种类别 常用的Javascript中常用设计模式的其中17种 详解设计模式六大原则
20151218mark 延伸扩展: -设计模式在很多语言PHP.JAVA.C#.C++.JS等都有各自的使用,但原理是相同的,比如JS常用的Javascript设计模式 -详解设计模式六大原则 设计 ...
- PHP 设计模式六大原则
http://www.cnblogs.com/yujon/p/5536118.html 设计模式六大原则(1):单一职责原则 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责 设计模 ...
- zt 设计模式六大原则(3):依赖倒置原则
下面说法对不对? 父类将算法(逻辑)封装起来,子类实现细节:这个就叫DIP(依赖倒置:Dependency Inversion Principles),模板模式就是这个原则的实现.如果在父类中加一个t ...
- 设计模式六大原则——合成/聚合复用原则(CARP)
1.定义 简而言之,对于合成/聚合复用原则的定义就是:要尽量使用合成和聚合,尽量不要使用继承. 2.释义 为什么"要尽量使用合成和聚合.尽量不要使用继承"呢? 这是由于: 第一,继 ...
- ZT 设计模式六大原则(1):单一职责原则
zt 设计模式六大原则(1):单一职责原则 分类: 设计模式 2012-02-21 09:52 25059人阅读 评论(65) 收藏 举报 设计模式stringclass编程 (THERE SHOUL ...
随机推荐
- HihoCoder第九周 状态压缩 二 与POJ2411总结
在此我向各位博友求助,特别想知道除了HihoCoder上面的结果要对1e9+7取余之外,这两道题还有什么其他的问题,都是骨牌覆盖问题,都是状态压缩+dp,为什么我能过poj2411的程序过不了Hiho ...
- plsql和navicat连接远程oracle(易错点)
plsql和navicat连接远程oracle,只需要安装oracle客户端即可.注意此处是oracle客户端(Instant Client),并不是oracle数据库. oracle客户端下载地址: ...
- cudaThreadSynchronize()
// 调用CUDA kernel 是非阻塞的,调用kernel语句后面的语句不等待kernel执行完,立即执行.所以在 call_kernel(see kernel.cu) 中执行 m5op.dump ...
- 浅谈Python之sys.argv
(1)sys.argv是什么 sys模块为进入解释器维护或使用的变量,以及与解释器相关的函数提供了途径.sys.argv在脚本程序中扮演了这样一个角色:将命令行输入的参数作为一个list传入脚本程序, ...
- Node.js NPM Package.json
章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json Nod ...
- Markdown工具推荐
Markdown 因语法简单,应用广泛,在近几年被很多开发者所喜爱.常用的语法不多,也就十来种吧.本人自从2017年接触就一发不可收拾. 在这几年里,用过了很多写Markdown的工具.接下来就以现在 ...
- ofo身陷被收购、破产传闻,中国的共享单车还能活下去吗?
大潮退去,终将现出谁在"裸泳".尤其是那些看似火爆却迅速陨落的新事物,总是避免不了让人发出"伤仲永"的感慨.这其中,共享经济就是很典型的案例.共享睡眠舱.共享马 ...
- python运算表达式
运算符1.算术运算符:+,-,*,/,//(求整商),%,**(求多次方,左边为数,右边为多少次方)2.关系运算符:>,<,==,<=,>=,!=3.测试运算:in,not i ...
- 浅谈$NTT$
\(NTT\),快速数论变换,可以理解为带模数的FFT. 原根 & 阶 先来补一点数论.(这里讲的应该很少,都是针对\(ntt\)胡的,具体的话可以去看<初等数论>那本小黄书). ...
- Hairpin|Bulge|Loop|假结|共变化(进化)|单序列预测|snRNA|snoRNA|siRNA|microRNA|piRNA|LncRNA|antisense RNAs|cis-NATs|trans-NATs|假基因|环形RNA
生物信息学 GU也可以配对,即“wobble” pairing GU. Hairpin发夹结构,最少不能少于3个碱基.没有配对 Bulge 单侧配对 Loop双侧配对 假结,游离的leading ed ...