一、什么是设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。
设计模式目录:
-
软件设计模式概述
-
GoF 的 23 种设计模式的分类和功能
-
UML中的类图及类图之间的关系
-
开闭原则——面向对象设计原则
-
里氏替换原则——面向对象设计原则
-
依赖倒置原则——面向对象设计原则
-
单一职责原则——面向对象设计原则
-
接口隔离原则——面向对象设计原则
-
迪米特法则——面向对象设计原则
-
合成复用原则——面向对象设计原则
-
创建型模式的特点和分类
-
单例模式(单例设计模式)详解
-
原型模式(原型设计模式)详解
-
工厂方法模式(详解版)
-
抽象工厂模式(详解版)
-
建造者模式(Bulider模式)详解
-
结构型模式概述(结构型模式的分类)
-
代理模式(代理设计模式)详解
-
适配器模式(Adapter模式)详解
-
桥接模式(Bridge模式)详解
-
装饰模式(装饰设计模式)详解
-
外观模式(Facade模式)详解
-
享元模式(详解版)
-
组合模式(详解版)
-
行为型模式概述(行为型模式的分类)
-
模板方法模式(模板方法设计模式)详解
-
策略模式(策略设计模式)详解
-
命令模式(详解版)
-
责任链模式(职责链模式)详解
-
状态模式(详解版)
-
观察者模式(Observer模式)详解
-
中介者模式(详解版)
-
迭代器模式(详解版)
-
访问者模式(Visitor模式)详解
-
备忘录模式(详解版)
-
解释器模式(详解版)
-
UMLet的使用与类图的设计
-
创建型模式应用实验
-
结构型模式应用实验
-
行为型模式应用实验
二、设计模式的三个分类
创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。
结构型模式:把类或对象结合在一起形成一个更大的结构。
行为型模式:类和对象如何交互,及划分责任和算法。
创建型模式要点:
单例模式:某个类只能有一个实例,提供一个全局的访问点。
简单工厂:一个工厂类根据传入的参量决定创建出那一种产品类的实例。
工厂方法:定义一个创建对象的接口,让子类决定实例化那个类。
抽象工厂:创建相关或依赖对象的家族,而无需明确指定具体类。
建造者模式:封装一个复杂对象的构建过程,并可以按步骤构造。
原型模式:通过复制现有的实例来创建新的实例。
结构型模式要点:
适配器模式:将一个类的方法接口转换成客户希望的另外一个接口。
组合模式:将对象组合成树形结构以表示“”部分-整体“”的层次结构。
装饰模式:动态的给对象添加新的功能。
代理模式:为其他对象提供一个代理以便控制这个对象的访问。
亨元(蝇量)模式:通过共享技术来有效的支持大量细粒度的对象。
外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。
桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变化。
行为型模式要点
模板模式:定义一个算法结构,而将一些步骤延迟到子类实现。
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器。
策略模式:定义一系列算法,把他们封装起来,并且使它们可以相互替换。
状态模式:允许一个对象在其对象内部状态改变时改变它的行为。
观察者模式:对象间的一对多的依赖关系。
备忘录模式:在不破坏封装的前提下,保持对象的内部状态。
中介者模式:用一个中介对象来封装一系列的对象交互。
命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。
访问者模式:在不改变数据结构的前提下,增加作用于一组对象元素的新功能。
责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。
迭代器模式:一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。
代理者模式介绍:
代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。它使得客户不能直接与真正的目标对象通信。代理对象是目标对象的代表,其他需要与这个目标对象打交道的操作都是和这个代理对象在交涉。
代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的,同时也在一定程度上面减少了系统的耦合度。
代理者模式分为两种:
一 静态代理
1.先创建抽象类
public interface Buyer {
//抽象方法
public String havealook();
}
2.实现抽象方法
public class RealBuyer implements Buyer{
//实现抽象方法
@Override
public String havealook() {
System.out.println(" ****买家实地查看" );
return "--买家提了一些意见";
}
}
3.创建静态代理类
public class ZhongJie implements Buyer{
//定义的变量
private Buyer target;
//构造方法
public ZhongJie(Buyer target){
this.target=target;
}
//实现抽象方法
public String havealook() {
//调用
ZhuiBei();
//调用抽象方法
String feedb =target.havealook();
//调用
aaf();
return "最后中介和卖家沟通》》》》》》》》》"+feedb;
}
//添加一些输出方法
public void ZhuiBei(){
System.out.println(" ==========中介前期准备 " );
System.out.println(" ==========中介前期准备 " );
}
//添加一些输出方法
public void aaf(){
System.out.println("》》》》》》》》》》 后期跟踪意见" );
}
}
4.创建测试类测试代码
public class BuyerTest {
public static void main(String[] args) {
//先调用客户类
RealBuyer rb =new RealBuyer();
//再调用继承类 实现中介 把客户类放在实体中介中
Buyer buyer=new ZhongJie(rb);
//定义变量输出继承类方法
String re=buyer.havealook();
//输出
System.out.println(re);
}
}
5.显示运行结果
==========中介前期准备
==========中介前期准备
****买家实地查看
》》》》》》》》》》 后期跟踪意见
最后中介和卖家沟通》》》》》》》》》--买家提了一些意见
二 动态代理
1.创建抽象类
//创建抽象类
public interface User {
//创建抽象方法
public String buyTick();
}
2.实现抽象方法
//实现抽象方法
public class RealUser implements User{
@Override
public String buyTick() {
System.out.println(" 排队中..............." );
return "电影票: 火影忍者";
}
//定义VIP等级
public int getVIP(){
return 0;
}
}
3.创建代理
public class Movie {
public static String payTicket(int vip,String ticketName){
try {
if (vip==0){
Thread.sleep(5000);
}else if(vip==1){
Thread.sleep(3000);
}else if(vip==2){
Thread.sleep(2000);
}else if (vip==3){
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
return ticketName+"购买成功";
}
//定义VIP等级
public int getVIP(){
return 10;
}
}
4.动态代理调用
public class IntermeHandler implements InvocationHandler {
//定义变量
private Object target;
public void setTarget(Object target){
this.target=target;
}
//实现调用
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String ticketName = (String)method.invoke(target, args);
String rs=Movie.payTicket(getVIP(), ticketName);
return rs;
}
//定义VIP等级
public int getVIP(){
return 10;
}
}
5.测试类测试数据
public class TickeTest {
public static void main(String[] args) {
//定义一个对象
Object target = new RealUser();
//实现动态代理对象
IntermeHandler handler= new IntermeHandler();
handler.setTarget(target);
//动态赋值
User user = (User) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),handler);
//调用方法
String result = user.buyTick();
//输出
System.out.println(result);
}
}
6.测试运行结果
排队中...............
电影票: 火影忍者购买成功