java设计模式系列4-----享元模式,代理模式,外观模式

1.享元模式

Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用.
享元模式的角色和职责
抽象享元角色;所有具体享元类的父类,规定一些需要实现的公共接口.
具体享元角色:抽象享元角色的具体实现类,并实现了抽象享源角色规定的方法.
享元工厂角色:负责创建和管理享元角色.

package com.ibeifeng.news;

public class Person {
	private String name;
	private int age;
	private String sex;
	
	public Person(String name, int age, String sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	
	public Person() {
		
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	
}
package com.ibeifeng.news;

public class Teacher extends Person {
	private String number;
	
	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	public Teacher(String name, int age, String sex,String number) {
		super(name, age, sex);
		this.number = number;
	}
	
	public Teacher() {
		super();
	}
	
}
package com.ibeifeng.news;

import java.util.HashMap;
import java.util.Map;
/*
*重点是此工厂类
*/
public class TeacherFactory {
	private Map<String,Teacher> pool;
	
	public TeacherFactory() {
		pool = new HashMap<String,Teacher>();
	}
	
	public Teacher getTeacher(String number) {
		Teacher teacher = pool.get(number);
		if(teacher == null) {
			teacher = new Teacher();
			teacher.setNumber(number);
			pool.put(number, teacher);
		}
		return teacher;
	}
}
package com.ibeifeng.news;

public class MainClass {
	public static void main(String[] args) {
		TeacherFactory factory = new TeacherFactory();
		Teacher teacher1 = factory.getTeacher("0102034");
		Teacher teacher2 = factory.getTeacher("0102035");
		Teacher teacher3 = factory.getTeacher("0102034");
		Teacher teacher4 = factory.getTeacher("0102037");
		
		System.out.println(teacher1.getNumber());
		System.out.println(teacher2.getNumber());
		System.out.println(teacher3.getNumber());
		System.out.println(teacher4.getNumber());
		
		if(teacher1 == teacher3) {
			System.out.println("true");
		} else {
			System.out.println("false");
		}
	}
}

2.代理模式

Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问.
所谓代理,是指具有与代理元(被代理的对象)具有相同接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理.
代理模式的角色和职责
subject(抽象主题角色):真实主题与代理主题的共同接口.
RealSubject(真实主题角色):定义了代理角色所代表的真实对象.
Proxy(代理主题角色):含有对真实主题角色的引用,代理角色通常将客户端调用传递给真实主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象.


public interface Subject {
	public  void sailBook();
}

public class RealSubject implements Subject {

	public void sailBook() {
		System.out.println("卖书");
	}

}

public class ProxySubject implements Subject{
	private RealSubject realSubject;

	public void sailBook() {
		dazhe();
		if(realSubject == null) {
			realSubject = new RealSubject();
		}
		realSubject.sailBook();
		give();
	}
	
	public void dazhe() {
		System.out.println("打折");
	}
	
	public void give() {
		System.out.println("赠送代金券");
	}
}

public class MainClass {
	public static void main(String[] args) {
		ProxySubject proxySubject = new ProxySubject();
		proxySubject.sailBook();
	}
}

动态代理

  1. InvocationHandler 接口
  2. invoke方法
  3. Proxy.newProxyInstance();
package com.ibeifeng.news;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MyHandler implements InvocationHandler {
	private RealSubject realSubject;
	
	public void setRealSubject(RealSubject realSubject) {
		this.realSubject = realSubject;
	}

	public Object invoke(Object proxy, Method method, Object[] args){
		Object result = null;
		dazhe();
		try {
			result = method.invoke(realSubject, args);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		give();
		return result;
	}
	
	public void dazhe() {
		System.out.println("打折");
	}
	
	public void give() {
		System.out.println("赠送代金券");
	}

}
package com.ibeifeng.news;

import java.lang.reflect.Proxy;

public class MainClass {
	public static void main(String[] args) {
		RealSubject realSubject = new RealSubject();
		MyHandler myHandler = new MyHandler();
		myHandler.setRealSubject(realSubject);
		
		Subject proxySubject = (Subject)Proxy.newProxyInstance(RealSubject.class.getClassLoader(), realSubject.getClass().getInterfaces(), myHandler);
		proxySubject.sailBook();
	}
}

3.外观模式

Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。
在这里插入图片描述
外观模式的角色和职责
Facade 为调用方定义简单的调用接口。
Clients 调用者。通过Facade接口调用提供某功能的内部类群。
Packages 功能提供者。指提供功能的类群(模块或子系统)。

package com.ibeifeng.news;

public class GuoZai {
	
	public void mai() {
		System.out.println("买国债");
	}
}
package com.ibeifeng.news;

public class Gupiao {
	
	public void mai() {
		System.out.println("买股票");
	}
}
package com.ibeifeng.news;

public class Qihuo {
	
	public void chao() {
		System.out.println("买期货");
	}
}
package com.ibeifeng.news;

public class JiJin {
	private Gupiao gupiao;
	private GuoZai guozai;
	private Qihuo qihuo;
	
	public JiJin() {
		this.guozai = new GuoZai();
		this.gupiao = new Gupiao();
		this.qihuo = new Qihuo();
	}
	
	public void maiJijinA() {
		this.guozai.mai();
		this.gupiao.mai();
	}
	
	public void maiJijinB() {
		this.guozai.mai();
		this.gupiao.mai();
		this.qihuo.chao();
	}
}
package com.ibeifeng.news;

public class MainClass {
	public static void main(String[] args) {
//		//80年代,基金出现之前
//		Gupiao gupiao = new Gupiao();
//		gupiao.mai();
//		
//		Qihuo qihuo = new Qihuo();
//		qihuo.chao();
//		
//		GuoZai guozhai = new GuoZai();
//		guozhai.mai();
		//有了基金之后
//		JiJin jijin = new JiJin();
//		jijin.maiJijinA();
		JiJin jijin = new JiJin();
		jijin.maiJijinB();
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值