设计模式的分类:分类标准是根据目的准则
1 创建型:与对象的创建有关
2 结构型:处理类与对象之间的组合
3 行为型:描述类与对象如何交互及如何分配职责
一共有23中设计模式
创建型:
1.抽象工厂模式AbstractFactory
2.建造者模式Builder
3.工厂方法模式FactoryMethod
4.原型模式Prototype
5.单例模式Singleton
结构型:
1.适配器模式Adapter
2.桥接模式Bridge
3.组合模式Composite
4.装饰模式Decorator
5.外观模式Facade
6.享元模式Flyweight
7.代理模式Proxy
行为型:
1.职责链模式Chainof Responsibility
2.命令模式Command
3.解释器模式Interpreter
4.迭代器模式Iterator
5.中介者模式Mediator
6.备忘录模式Memento
7.观察者模式Observer
8.状态模式State
9.策略模式Strategy
10.模板方法模式TemplateMethod
11.访问者模式Visitor
重点学习以下四种模式:工厂模式、单例模式、观察者模式、代理模式
1 工厂模式
特点:
1.1 简单工厂模式
1.2 工厂方法模式
1.3 抽象工厂模式
开闭原则:对程序扩展开放,对程序修改关闭
使用各种程序设计模式的最主要目的:提高程序的扩展性、可维护性
使用工厂模式的两种情况:
1. 不能预见将要创建的那种类的实例
2. 系统不关心对象被创建的具体细节
代码示例:
<<简单工厂>>
/**
* 简单工厂
* 1 工厂类角色
* 2 抽象产品类角色
* 3 具体产品类角色
* */
// 抽象产品类角色
interface Car{
public void drive();
}
//具体产品类角色
class RedCar implements Car{
public void drive(){
System.out.println("I'm driving a red Car.");
}
}
//具体产品类角色
class BlackCar implements Car{
public void drive(){
System.out.println("I'm driving a Black Car.");
}
}
//这里可以扩展其他的颜色的产品...
//工厂类角色
class SimpleFactory{
Car car;
String color;
public SimpleFactory(String color){
this.color=color;
}
public Car getObject(){
if(color.equals("red")){
car=new RedCar();
return car;
}else if(color.equals("black")){
car=new BlackCar();
return car;
}
else{
System.out.println("no related Chioce!");
return null;
}
}
}
public class FactoryDemo {
public static void main(String agrs[]){
SimpleFactory f1=new SimpleFactory("red");
SimpleFactory f2=new SimpleFactory("black");
RedCar redCar=(RedCar)f1.getObject();
redCar.drive();
f1.getObject().drive();
f2.getObject().drive();
}
}
<<抽象工厂>>
/**
* 工厂方法模式
* 1 抽象工厂角色
* 2 具体工厂角色
* 3 抽象产品角色
* 4 具体产品角色
*
* 说明:由于业务的复杂,利用简单工厂模型不再适用,因为当增加产品时,对于产品符合开闭原则,
* 但是对于工厂角色则明显不符合开闭原则,所有现在需要将工厂角色也抽象出来,可以是抽象
* 类或者借口实现
* */
//抽象工厂角色
interface AbstractFactory{
public Car getObject(String color);
}
//具体工厂角色
class Factory1 implements AbstractFactory{
Car car;
public Car getObject(String color){
if(color.equals("red")){
car=new RedCar();
return car;
}
else if(color.equals("black")){
car=new BlackCar();
return car;
}
else {
System.out.println("there is no related Option!");
return null;
}
}
}
//具体工厂角色
class Factory2 implements AbstractFactory{
Car car;
public Car getObject(String color){
if(color.equals("yellow")){
car=new YellowCar();
return car;
}
else if(color.equals("blue")){
car=new BlueCar();
return car;
}
else {
System.out.println("there is no related Option!");
return null;
}
}
}
//这里可以添加很多具体工厂。。。
// 抽象产品角色同上
// 具体产品角色可以在扩展,比如说下面再扩展两个具体的产品角色YellowCar,BlueCar
// 抽象产品类角色
interface Car{
public void drive();
}
//具体产品类角色
class RedCar implements Car{
public void drive(){
System.out.println("I'm driving a red Car.");
}
}
//具体产品类角色
class BlackCar implements Car{
public void drive(){
System.out.println("I'm driving a Black Car.");
}
}
//具体产品角色
class YellowCar implements Car{
public void drive(){
System.out.println("I'm driving a yellow Car.");
}
}
//具体产品角色
class BlueCar implements Car{
public void drive(){
System.out.println("I'm driving a blue Car.");
}
}
public class FactoryDemo {
public static void main(String agrs[]){
Factory1 ff1=new Factory1();
ff1.getObject("red").drive();
ff1.getObject("black").drive();
Factory2 ff2=new Factory2();
ff2.getObject("yellow").drive();
ff2.getObject("blue").drive();
}
}
2 单例模式
特点:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供该实例
代码示例:
//懒汉式
class Singleton2{
private Singleton2(){} // 避免类被外部实例化
private static Singleton2 singleton;
public static Singleton2 getInstance(){
if(singleton==null)
singleton=new Singleton2();
return singleton;
}
}
// 饿汉式
class Singleton1{
private Singleton1(){}
private static Singleton1 singleton1=new Singleton1();
static Singleton1 getInstance(){
return singleton1;
}
}
3 观察者模式
特点:简单地说就是有一个或多个观察者对一个被观察者进行监视,当被观察者发生变化时则通知所有的观察者更新,达到这样一个效果。
(更详细的参考:点击打开链接)
代码示例
package org.wb.pattern;
import java.util.Vector;
/**
* 1 观察者
* 1.1 抽象观察者:可以由抽象类或接口实现,实现一个update()方法,更新操作
* 1.2 具体观察者:继承或实现抽象观察者
*
* 2 被观察者
* 2.1 抽象被观察者:可以由抽象类或接口实现,包括观察者列表、添加、删除观察者、通知观察者更新
* 2.2 具体被观察者:继承或实现抽象被观察者
* */
public class ObserverDemo {
public static void main(String agrs[]){
Observer1 observer1=new Observer1();
Observer2 observer2=new Observer2();
Observered observered=new Observered();
observered.addObserver(observer1);
observered.addObserver(observer2);
observered.notifyObserver();
}
}
//抽象观察者
interface AbstractObserver{
public void update();
}
//具体观察者
class Observer1 implements AbstractObserver{
public void update(){
System.out.println("Observer1 get it!!");
}
}
//具体观察者
class Observer2 implements AbstractObserver{
public void update(){
System.out.println("Observer2 get it!!");
}
}
//抽象被观察者
interface AbstractObservered{
//在具体实现中需要加上观察者列表
public void addObserver(AbstractObserver observer);
public void deleteObserver(AbstractObserver observer);
public void notifyObserver();
}
//具体被观察者
class Observered implements AbstractObservered{
Vector <AbstractObserver> vactorList=new Vector<AbstractObserver>();
public void addObserver(AbstractObserver observer){
if(!vactorList.contains(observer)){
vactorList.add(observer);
}
}
public void deleteObserver(AbstractObserver observer){
if(vactorList.contains(observer)){
vactorList.remove(observer);
}
}
//通知观察者列表中所有的观察者更新
public void notifyObserver(){
if(vactorList.size()!=0){
for(AbstractObserver observer:vactorList){
observer.update();
}
}
}
}
4 代理模式
特点:在有些情况下,一些客户对象不能直接或者不需要直接访问另一个对象,而是用代理对象来完成对真实对象的访问的情况
代码示例
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 1 抽象类角色:真实类或代理类需要继承或实现的角色
* 2 真实类角色:最终要被引用的对象,代理类角色所代表的对象
* 3 代理类角色:代理类对象中包含有对真实类对象的引用,对真实类进行操作,同时也可以添加一些额外的操作
* 简单的说就是对真实类进行封装
* 4 客户端角色:客户端对象通过对代理类的访问来达到操作真实类的母的,比如说有些情况我们不能直接访问到
* 真实类,那么我们只能利用代理的方式
*
* 5 动态代理:简单地说就是在程序运行时才产生代理类对象
*
* 6 下面将实现一般代理和动态代理
*
* */
public class ProxyDemo {
// public static void main(String agrs[]){
// RealSubject rs=new RealSubject();
// ProxySubject ps=new ProxySubject(rs);
// ps.option();
// }
public static void main(String args[]){
RealSubject rs=new RealSubject();
DynamicProxy dp=new DynamicProxy(rs);
Class<? extends RealSubject> cls=rs.getClass();
AbstractSubject abstractSubject=(AbstractSubject)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),dp);
abstractSubject.option();
}
}
//抽象类角色
interface AbstractSubject{
public void option();
}
//真实类角色
class RealSubject implements AbstractSubject{
public void option(){
System.out.println("来自真实类角色对象的操作!");
}
}
//代理类角色
class ProxySubject implements AbstractSubject{
RealSubject realSubject;//在代理类中必须要包含被真实代理的对象
public ProxySubject(RealSubject realSubject){
this.realSubject=realSubject;
}
public void option(){
before();
if(realSubject!=null){
realSubject.option();
}
after();
}
public void before(){
System.out.println("在代理操作前的准备!");
}
public void after(){
System.out.println("在代理操作后的处理!");
}
}
/**
* 动态代理示例:动态代理和一般代理的区别是,动态代理可以在程序运行时生成代理类实例对象
*
* */
//代理类角色
class DynamicProxy implements InvocationHandler{
RealSubject realSubject;
public DynamicProxy(RealSubject realSubject){
this.realSubject=realSubject;
}
public Object invoke(Object obj,Method method,Object[] args){
before();
try {
method.invoke(realSubject, args);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
after();
return null;
}
public void before(){
System.out.println("在代理操作前的准备!");
}
public void after(){
System.out.println("在代理操作后的处理!");
}
}
总结:对于设计模式在平时写代码的过程中没有怎么用,这次特意整理一下,方便以后再学习或者遇到的时候能有点印象