目录
设计模式
设计模式概述:
介绍:
**设计模式是人们在长期的软件开发中的经验总结,是对某些特定问题的经过实践检验的特定解决方法,是软件设计中的“三十六计”.**
作用:
- 使开发者可以更加简单方便地复用 成功的设计和体系结构List item
- 帮助开发者做出有利于系统复用的选择,避免损害系统复用性的设计
- 使其他开发者更加容易理解其设计思路,便于团队交流
设计模式的分类
目前所说的设计模式通常指GOF(Gang of Four 四人组)
包含23种设计模式
设计模式有两种分类方式。
(一)根据目的划分
1.创建型模式
用于描述如何创建对象其主要的特点是将对象的创建与使用分离。
2.结构型模型
用于描述如何将类或对象按某种布局组成更大的结构
3.行为型模式
用于描述了或对象之间如何相互协作,共同完成单个对象无法独立完成的任务以及如何分配职责。
(二)根据作用范围划分 :
即根据设计模式主要作用于类上还是主要作用于对象上来划分,这种可分为类模式和对象模式两种。
1.类模式:用于处理类于子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了
2.对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时是可以变化的,更具动态性。
面对对象设计原则
设计原则有七种分别是
1.单一职责原则:
单一职责原则规定一个类应该有且仅有一个引起他变化的原因,简单来说,一个类应该只负责一个职责,否则类应该被拆分。
如果一个类承担太多职责 会出现一下两个缺点:
第一: 一个职责的变化可能影响这个类实现其他职责的能力,或者引发其他职责故障。
第二:当客户需要该类的某一个职责时,不得不将其他不需要的职责全部都包含进来,从而造成亢余或风险。
2.开闭原则
开闭原则是面向对象设计中最基础的设计原则,开闭原则规定一个实体软件,如类,模块核函数,应该对扩展开放,对修改关闭,其意思是,在程序需要进行扩展的时候,不能通过修改已有的代码实现变化,而应该通过扩展软件实体的方式实现,如根据需要重新哦爱生一个实现类。想要达到这样的效果,这就需要使用接口,面向接口编程。
3.里式替换原则
里式替换原则是面对对象设计的基本原则之一,是继承复用的基石。该原则规定所有引用基类的地方必须透明的使用其子类的对象。这个原则可以判断继承关系是否合理。
4.依赖倒置原则
依赖导致原则的核心思想是:依赖于约定而不依赖于具体实现,即面向接口编程,对象的依赖关系有三种传递方法
(1)通过构造方法传递依赖对象,即构造方法的参数是需要依赖的接口类型。
(2)通过setter方法传递依赖对象,即setter方法的参数是需要依赖的接口类型。
(3)接口声明依赖,及接口的参数是需要依赖的接口类型。
作用:能够降低客户于实现模块之间的耦合,
5.接口隔离原则
要求尽量将庞大的接口拆分成更小,更具体的接口。让接口中只包含客户感兴趣的方法。一个类对另一个类的依赖应该建立在最小的接口上。要为各个类建立他们需要的专用接口,而不要试图去建立一个庞大的接口供所有依赖他的类去调用,否则很多实现类要被迫的去实现他们不要的方法。
接口的隔离原则和单一原则都是为了提高类的内聚性,降低它们之间的耦合度,但两者是不同的。
- 单一职责原则注重的是职责,而接口隔离原则注重的是对接口的依赖的隔离。
单一职责原则主要约束类,他针对的是程序中的实现和细节;而接口隔离原则主要约束接口,主要针对抽象和程序整体框架的创建。
6.迪米特法则
迪米特法则又称最少知道原则,是直接一个软件实体应当尽可能的少的与其他实体发生相互作用。
####7.合成复用原则
尽量使用组合聚合的方式,而不是继承关系达到软件复用的目的。
继承复用是类型的复用:必须具备is-a关系才可通过继承方式进行复用,且从基类继承而来的实现是静态的,不可能在运行期间发生变化,因此没有足够的灵活性。
而合成复用是has-a关系,将已有对象纳入到新对象中使之成为新对象的一部分,因此新对象可以调用已有对象的功能,使用合成复用方式,新对象可以自运行期间动态的引用与成分对象类型相同的实现。
设计模式应用
简单工厂模式
简单工厂模式包含
1。工厂:简单模式的核心,负责实现创建所有实例的逻辑,工厂提供静态方法,根据传入的参数创建所需的产品实例。
2.抽象产品:工厂创建的所有实例的父类类型,是负责描述所有产品的公共接口。可以是接口或抽象类。
.3.具体产品:抽象产品的实现类,是工厂的创建目标,工厂创建的实例就是某个具体产品类的实例。
简单工厂模式操作
// 创建工厂
public class JDBCFactory {
public static JDBC newInstance() {
return new MySQLJDBC();
}
public static JDBC newInstance(String type) {
if ("mysql".equals(type)) {
return new MySQLJDBC();
}else if("oracle".equals(type)) {
return new OracleJDBC();
}return null;}}
//通过类图创建工厂对象 重写工厂中的方法
public class UserService {
//添加,修改,删除..
//private JDBC jdbc=new OracleJDBC();//耦合度高
private JDBC jdbc=JDBCFactory.newInstance("oracle");
//添加
public void addUser() {
jdbc.Connection();
System.out.println("添加用户成功!");
}}
工厂方法模式
工厂方法模式操作
//1.创建工厂接口
public interface JDBCFactory {
public JDBC newInstance();}
//工厂实现类实现工厂接口
public class MySQLJDBCFactory implements JDBCFactory{
public JDBC newInstance() {
return new MySQLJDBC();
}}
//在用户类中创建所需的工厂对象
public class UserService {
//添加,修改,删除..
private JDBC jdbc;
public void setJdbc(JDBC jdbc) {
this.jdbc = jdbc;
}
//添加
public void addUser() {
jdbc.Connection();
System.out.println("添加用户成功!");
}}
//测试类
public class TestJDBC {
public static void main(String[] args) {
//确定数据库类型
JDBCFactory factory=new MySQLJDBCFactory();//创建工厂对象
JDBC jdbc=factory.newInstance();//使用工厂对象,创建JDBC对象
UserService service=new UserService();
service.setJdbc(jdbc);//设置业务类中使用的JDBC对象
service.addUser();
}}
代理模式
代理模式包含
1.抽象主题:通过接口或抽象类声明业务方法。
2.真是主题:实现了抽象主题中的具体业务,是实施代理的目标对象,及代理对象所代表的真是对象,是最终要引用的对象,
3.代理:提供了与真实主题相同的接口,其内部含有对真实主题的引用,可以访问,控制或拓展真实主题的功能。
实现代理的方式有很多种,总体上分为静态代理或动态代理两种。
- 静态代理有开发者针对抽象主题编写相关的代理类实现,编译之后生成代理类的class文件。静态代理在编译时已经实现,代理关系在编译期就已经绑定,编译完成后代理类是一个实际的class文件。
- 动态代理是在运行时动态生成的,即编译完成后没有实际的代理类class文件,而是在运行动态生成代理类字节码,并加载到JVM中。
静态代理
静态代理的操作步骤
动态代理
动态代理操作步骤