首页 > 其他 > 详细

设计模式之我见(三)

时间:2016-07-13 16:40:28      阅读:148      评论:0      收藏:0      [点我收藏+]

Seven:装饰模式

装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例下图是类与类之间的关系。


技术分享

但是这个类图并没有表现出不同的装饰风格时候要如何应对,比如一个女人,她需要的装饰肯定不会只有一种,这个时候这个类图的缺点就显示出来了,太过简洁。补救的方法也很简单,对Decorator类进行扩展,对method()方法进行覆盖,就可以达到多种多样的装饰风格的目的。


下面是一个文本框,对其进行不同的修饰,一个为其装上滚动条,一个为其画上边框。

被装饰类

<span style="font-size:14px;">package com.zcl.design.decorator;

public class TextView extends VisualComponent {

	@Override
	public void draw() {
		System.out.println("在窗口显示正文");
	}

}</span>
共同的父类
package com.zcl.design.decorator;

public abstract class VisualComponent {
      public abstract void draw();
}
装饰类
package com.zcl.design.decorator;

public class Decorator extends VisualComponent {
	//要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例
	private VisualComponent textview;

	public Decorator(VisualComponent component) {
		this.textview=component;
	}

	@Override
	public void draw() {
		System.out.println("在Dectorator类中对textview进行装饰");
		textview.draw();//被装饰的draw方法
	}

}
装饰类的子类(分别担当不同的装饰风格)
加滚动条

package com.zcl.design.decorator;

public class ScrollDecorator extends Decorator {
private boolean mscroll;
private void  scrollTo(boolean mscroll) {
	if (mscroll) {
		System.out.println("为TextView加上滚动条");
	} else {
		System.out.println("不为TextView加上滚动条");
	}
}
	public ScrollDecorator(VisualComponent component,boolean scroll) {
		super(component);
		this.mscroll=scroll;
	}
	public void draw() {
		super.draw();//父类的
		scrollTo(mscroll);
	}
}
加上边框
package com.zcl.design.decorator;

public class BorderDecorator extends Decorator {
	private int mborderWidth;
	private void drawBorder(int borderWidth){
		System.out.println("为TextView画上"+borderWidth+"cm的边框");
	}
	public BorderDecorator(VisualComponent component,int borderWidth) {
		super(component);
		this.mborderWidth= borderWidth;
	}
	
	public void draw() {
		super.draw();
		drawBorder(mborderWidth);
	}
}
测试类
package com.zcl.design.decorator;

public class Client {

	public static void main(String[] args) {
		VisualComponent textView = new TextView();//被装饰者对象
		BorderDecorator borderDecorator = new BorderDecorator(textView,5);//装饰者子类对象1
		borderDecorator.draw();
		ScrollDecorator scrollDecorator=new ScrollDecorator(textView, true);//装饰者子类对象2
		scrollDecorator.draw();
	}

}
装饰器模式是装饰者在自身的相同函数内内通过被装饰者对象调用其相应函数的形式在自身内完成调用,并且完成其他的内容完成对被装饰者的装饰作用。
Eight:外观模式

外观模式是一种很简单的模式,其作用也很简单,是为了降低类与类之间的耦合
例如:你要打开门才能打开灯,煮饭,睡觉等一系列动作。这样这个门就是他们的外观,一切的动作都要先进门然后你可以对里面的任何一种动作进行实施。
Light

package com.zcl.design.Facade;

public class Light {
	public void openLight() {
		System.out.println("打开灯");
	}
}
Bed
package com.zcl.design.Facade;

public class Bed {
public void sleep() {
	System.out.println("在床上睡觉");
}
}
Food
package com.zcl.design.Facade;

public class Food {
public void EatFood() {
	System.out.println("吃东西");
}
}
然后就是重头类了我们的Door类

Door

package com.zcl.design.Facade;

public class Door {
	private Food food = new Food();
	private Bed bed = new Bed();
	private Light light = new Light();

	public Door() {
		System.out.println("进了门");
	}

	public void foodmethod() {
		this.food.EatFood();
	}

	public void bedmethod() {
		this.bed.sleep();
	}

	public void lightmenthod() {
		this.light.openLight();
	}
}
测试类Client
package com.zcl.design.Facade;

public class Client {

	public static void main(String[] args) {
		Door door = new Door();
		door.bedmethod();
		door.foodmethod();
		door.lightmenthod();
	}

}
点评:这个模式只是将其他类封装到一个“袋子里”,而只留一个口来进行跟外界的交互。这样这些类都依赖于这一个类,总体上降低了类与类之间的耦合。但是各个类都跟这一个类有交互,这个类会很庞大,而且很复杂,是这个模式的一个缺点。
Nine:桥接模式
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。


这里面我贴上一个Demo的代码,大家可以品一品。

package com.zcl.design.bridge.pen;

public interface Color {
	public void bepaint(String penType, String name);
}

package com.zcl.design.bridge.pen;

public class Blue implements Color {
	public void bepaint(String penType, String name) {
		System.out.println(penType + " 蓝色的" + name + ".");
	}
}
package com.zcl.design.bridge.pen;

public abstract class Pen {
	protected Color color;

	public void setColor(Color color) {
		this.color = color;
	}

	public abstract void draw(String name);
}
package com.zcl.design.bridge.pen;

public class BigPen extends Pen {
	public void draw(String name) {
		String penType = " 大号毛笔绘制";
		this.color.bepaint(penType, name);
	}
}
测试类:

package com.zcl.design.bridge.pen;

public class Client {

	public static void main(String[] args) {
		Color color=new Blue();
		Pen pen = new BigPen();
		pen.setColor(color);
		pen.draw(" 鲜花");
	}

}
Ten:策略模式
策略模式拿到现实来讲的话就是你面前有你要从N种方法中选择一个进行采用实行。例如:一个很经典的例子,你要出去旅行,你要乘坐交通工具,第一你可以乘坐汽车,第二你可以乘坐火车,第三,你可以乘坐飞机。当你选择了一种方式,你就是选择了一种策略。
贴上源码:
package com.zcl.design.celue;

/**
 * @author zcl
 *
 */
public class Person {
	private TravelStrategy strategy;

	public void setStrategy(TravelStrategy strategy) {
		this.strategy = strategy;
	}

	public void travel() {
		strategy.travel();
	}
}
package com.zcl.design.celue;

/**
 * @author zcl
 *
 */
public abstract class TravelStrategy {
	public abstract void travel();
}
package com.zcl.design.celue;

/**
 * @author zcl
 *
 */
public class AirplaneStrategy extends TravelStrategy {

	@Override
	public void travel() {
		System.out.println("The Customer choose the AirplaneStrategy");
	}

}
package com.zcl.design.celue;

/**
 * @author zcl
 *
 */
public class BicycleStrategy extends TravelStrategy {

	@Override
	public void travel() {
		System.out.println("The Customer choose the BicycleStrategy");
	}

}
package com.zcl.design.celue;

/**
 * @author zcl
 *
 */
public class TrainStrategy extends TravelStrategy {

	@Override
	public void travel() {
		System.out.println("The Customer choose the TrainStrategy");
	}

}
测试类Client
package com.zcl.design.celue;

public class Test {

	public static void main(String[] args) {
		Person person = new Person();
		TravelStrategy airplaneStrategy = new AirplaneStrategy();
		TravelStrategy bicycleStrategy = new BicycleStrategy();
		TravelStrategy trainStrategy = new TrainStrategy();
		person.setStrategy(airplaneStrategy);
		person.travel();
		person.setStrategy(bicycleStrategy);
		person.travel();
		person.setStrategy(trainStrategy);
		person.travel();
	}

}
Eleven:观察者模式
观察者模式是一种观察别的类的状态是否发生改变,如果改变怎样怎样的模式。类似于你被绑架了,绑匪在监视着你,如果你乖乖的,他们就不对你采取过激行为,如果你不老实,他们可能就回来收拾你了。

这里我也写了一个Demo,是外面下雨,女人会出去收衣服,男人对下雨没什么感觉,我该干嘛干嘛。

package com.zcl.design.observer;

import java.util.*;

public abstract class MySubject {
	protected ArrayList observers = new ArrayList();

	// 注册方法
	public void attach(MyObserver observer) {
		observers.add(observer);
	}

	// 注销方法
	public void detach(MyObserver observer) {
		observers.remove(observer);
	}
	// 抽象通知方法
	public abstract void rain(); 
}
package com.zcl.design.observer;

public class Rain extends MySubject {
	//通知方法,通知观察者
	public void rain() {
		System.out.println("下雨了");
		System.out.println("----------------------------");
		for (Object obs : observers) {
			((MyObserver) obs).response();
		}
	}
}
上面是被观察者
package com.zcl.design.observer;

public interface MyObserver {
	//抽象响应方法
	public void response();
	
}
package com.zcl.design.observer;

public class Woman implements MyObserver {
	//响应方法
	@Override
	public void response() {
		System.out.println("起来收衣服");
	}
}
package com.zcl.design.observer;

public class Man implements MyObserver {
	//响应方法
	@Override
	public void response() {
		System.out.println("继续看电视,下雨跟我没什么关系");
	}
}
上面是观察者

测试类Client

package com.zcl.design.observer;

public class Client {
	public static void main(String a[]) {
		MySubject subject = new Rain();
		MyObserver obs1 = new Man();
		MyObserver obs2 = new Woman();
		subject.attach(obs1);
		subject.attach(obs2);
		subject.rain();
	}
} 
<textarea class="goog-textarea short_text" id="source-is" name="text-is" disabled="disabled" dir="ltr" style="overflow-y:hidden; overflow-x:auto; padding-bottom:32px; height:69px; padding-right:20px"></textarea>








设计模式之我见(三)

原文:http://blog.csdn.net/zcl1359205840/article/details/51889767

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!