Java的设计模式

1 java的设计模式

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
1.1 设计模式的分类
设计模式分为三种类型,共23种:

创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。

1.2 观察者模式
例子:现在很多的人都要购买房子,都在关注着房子,但是因为价格比较高,都不出手。每当房子价格有变化的时候,所有的购房者都可以得到信息,实际上这就是一个观察者,都关注着房子的价格。
在这里插入图片描述

如果要是实现观察者模式,就必须依靠的Java.util包,提供的Observable(被观察的对象)类和observer(观察者)接口

代码:

//被观察对象(房子)
class House extends Observable{
	public float price;//价格是被观察的对象
	  public float getPrice() {
		return price;
	}
//	  这个方法就是更改价格的时候就会被观察到
	public void setPrice(float price) {
		super.setChanged();//提示父类发生改变了(这里就是一个变化点)
		super.notifyObservers(price);//通知观察者对象现在发生变化了
		this.price = price;
	}
	
	public String toString() {
		return "房子价格为:"+price;
	};
//	构造方法
	 public  House(float price){
      this.price=price;		  
	  }
	
}

//观察者对象(要买房子的人)
class Houseman implements Observer{
	public String name;
//	设置每一个购房者的姓名
	public Houseman(String name){
		this.name=name;
		
	}
	
	

	
	public void update(Observable o, Object arg) {
		    System.out.println(name+"房子的价格更改为");
		    System.out.println(arg);
		
	}
	
}
public class Housetest {

	
	public static void main(String[] args) {
		House house=new House(123456);
		Houseman houseman1=new Houseman("买房者张三:");
		Houseman houseman2=new Houseman("买房者李四:");
		Houseman houseman3=new Houseman("买房者王五:");
		house.addObserver(houseman3);
		house.addObserver(houseman2);
		house.addObserver(houseman1);
		System.out.println("房子的原价"+house);//显示价格
		house.setPrice(789456);//价格变化
		System.out.println("调节后的"+house);//价格变化后的价格
		}

}

1.3工厂模式

1、静态工厂模式 这个最常见了,项目中的辅助类,TextUtil.isEmpty等,类+静态方法。 2、简单工厂模式(店里买肉夹馍)
定义:通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
3. 工厂方法模式(开分店) 定义:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。 对比定义: 1、定义了创建对象的一个接口:public abstract RouJiaMo sellRoujiaMo(String
type); 2、由子类决定实例化的类,可以看到我们的馍是子类生成的。
4.抽象工厂模式(使用官方提供的原料) 定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。 对比定义: 1、提供一个接口:public interface RouJiaMoYLFactroy 2、用于创建相关的或依赖对象的家族 public
Meat createMeat();public YuanLiao createYuanliao();我们接口用于创建一系列的原材料。

1.4 单例模式
单例模式主要是为了避免因为创建了多个实例造成资源的浪费,且多个实例由于多次调用容易导致结果出现错误,而使用单例模式能够保证整个应用中有且只有一个实例。

定义:只需要三步就可以保证对象的唯一性 (1) 不允许其他程序用new对象 (2) 在该类中创建对象 (3)
对外提供一个可以让其他程序获取该对象的方法 对比定义: (1) 私有化该类的构造函数 (2) 通过new在本类中创建一个本类对象
(3) 定义一个公有的方法,将在该类中所创建的对象返回

单例模式的实现方式有7中方式:

含懒汉式[双重校验锁 推荐用]
在这里插入图片描述
1.5 适配器模式
定义:将一个类的接口转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以相互合作。这个定义还好,说适配器的功能就是把一个接口转成另一个接口。

以充电器为实例: 手机充电器一般都是5V左右吧,咱天朝的家用交流电压220V,所以手机充电需要一个适配器(降压器) 一部手机:
Mobile.java 手机依赖一个提供5V电压的接口: V5Power.java 我们拥有的是220V家用交流电:
V220Power.java 适配器,完成220V转5V的作用:V5PowerAdapter.java

1.6 代理模式
我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品。关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,“委托者”对我们来说是不可见的;其次,微商代理主要以朋友圈的人为目标客户,这就相当于为厂家做了一次对客户群体的“过滤”。我们把微商代理和厂家进一步抽象,前者可抽象为代理类,后者可抽象为委托类(被代理类)。

通过使用代理,通常有两个优点,并且能够分别与我们提到的微商代理的两个特点对应起来: 优点一:可以隐藏委托类的实现;
优点二:可以实现客户与委托类间的解耦,在不修改委托类代码的情况下能够做一些额外的处理。

应用实例: 1、Windows 里面的快捷方式。
2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。
3、买火车票不一定在火车站买,也可以去代售点。
4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。 5、spring aop。

静态代理 :若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的。
通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类。

动态代理 :代理类在程序运行时创建的代理方式被成为 动态代理。也就是说,这种情况下,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。相比于静态代理,动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类的函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值