设计模式讲解 - 1835434698/1835434698.github.io GitHub Wiki
1、工厂
工厂就好比是主管,产品就好像码农。这主管比较懒,有人找他,他就只是负责对应的人,其他啥也不干。
1.1 简单工厂
对最终干活的码农抽取一个公共接口。
public interface Phone {
void make();
}
public class MiPhone implements Phone {
public MiPhone() {
this.make();
}
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("make xiaomi phone!");
}
}
public class IPhone implements Phone {
public IPhone() {
this.make();
}
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("make iphone!");
}
}
public class PhoneFactory {
public Phone makePhone(String phoneType) {
if(phoneType.equalsIgnoreCase("MiPhone")){
return new MiPhone();
}
else if(phoneType.equalsIgnoreCase("iPhone")) {
return new IPhone();
}
return null;
}
}
public class Demo {
public static void main(String[] arg) {
PhoneFactory factory = new PhoneFactory();
Phone miPhone = factory.makePhone("MiPhone"); // make xiaomi phone!
IPhone iPhone = (IPhone)factory.makePhone("iPhone"); // make iphone!
}
}
1.2 工厂方法
连同管理码农的主管一块抽象了(此时一个主管管一个码农吧)
public interface AbstractFactory {
Phone makePhone();
}
public class XiaoMiFactory implements AbstractFactory{
@Override
public Phone makePhone() {
return new MiPhone();
}
}
public class AppleFactory implements AbstractFactory {
@Override
public Phone makePhone() {
return new IPhone();
}
}
public class Demo {
public static void main(String[] arg) {
AbstractFactory miFactory = new XiaoMiFactory();
AbstractFactory appleFactory = new AppleFactory();
miFactory.makePhone(); // make xiaomi phone!
appleFactory.makePhone(); // make iphone!
}
}
1.3 抽象工厂
主管工作量翻倍了,一个主管管理多个码农了。
public interface PC {
void make();
}
public class MiPC implements PC {
public MiPC() {
this.make();
}
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("make xiaomi PC!");
}
}
public class MAC implements PC {
public MAC() {
this.make();
}
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("make MAC!");
}
}
public interface AbstractFactory {
Phone makePhone();
PC makePC();
}
public class XiaoMiFactory implements AbstractFactory{
@Override
public Phone makePhone() {
return new MiPhone();
}
@Override
public PC makePC() {
return new MiPC();
}
}
public class AppleFactory implements AbstractFactory {
@Override
public Phone makePhone() {
return new IPhone();
}
@Override
public PC makePC() {
return new MAC();
}
}
public class Demo {
public static void main(String[] arg) {
AbstractFactory miFactory = new XiaoMiFactory();
AbstractFactory appleFactory = new AppleFactory();
miFactory.makePhone(); // make xiaomi phone!
miFactory.makePC(); // make xiaomi PC!
appleFactory.makePhone(); // make iphone!
appleFactory.makePC(); // make MAC!
}
}
2、策略模式
主管负责了一些任务,但是具体任务都是交给手下的码农去干的。
public interface Weapon {
public void gun();
}
public class FirstGun implements Weapon {
@Override
public void gun() {
System.out.println("使用AWM狙击步枪。");
}
}
public class SecondGun implements Weapon {
@Override
public void gun() {
System.out.println("使用S12K。");
}
}
public class Context {
Weapon weapon;
public Context(Weapon weapon) { //构造函数
super();
this.weapon = weapon;
}
public Weapon getWeapon() { //get方法
return weapon;
}
public void setWeapon(Weapon weapon) { //set方法
this.weapon = weapon;
}
public void gun() {
weapon.gun();
}
}
public class StrategyClient {
public static void main(String[] args) {
//使用构造函数默认选择一把AWM狙击步枪(一个策略)
Context context=new Context(new FirstGun());
context.gun();
//使用get、set方法切换到S12K(切换策略) System.out.println("------右前方30米发现敌人------");
contex.set(new SecondGun());
context.gun(); }
}
3、适配器模式
主管继承了码农的一个共有对象,可以直接通知其做任务。
//目标接口
interface Target{
public void request();
}
//适配者接口(源角色)
class Adaptee{
public void specificRequest(){
System.out.println("适配者中的业务代码被调用!");
}
}
//类适配器类
class ClassAdapter extends Adaptee implements Target{
public void request(){
specificRequest();
}
}
//客户端代码
public class ClassAdapterTest{
public static void main(String[] args){
System.out.println("类适配器模式测试:");
Target target = new ClassAdapter();
target.request();
}
}
4、代理模式
5、责任链模式(拦截器)
就是主管把任务告诉每一个,大家自己认领自己任务。
public static void main(String[] args){
//组装责任链
Handler handler1=new ConcreteHandler1();
Handler handler2=new ConcreteHandler2();
handler1.setNext(handler2);
//提交请求
handler1.handleRequest("two");
}
//抽象处理者角色
abstract class Handler{
private Handler next;
public void setNext(Handler next){
this.next=next;
}
public Handler getNext(){
return next;
}
//处理请求的方法
public abstract void handleRequest(String request);
}
//具体处理者角色1
class ConcreteHandler1 extends Handler{
public void handleRequest(String request){
if(request.equals("one")) {
System.out.println("具体处理者1负责处理该请求!");
}else{
if(getNext()!=null){
getNext().handleRequest(request);
}else{
System.out.println("没有人处理该请求!");
}
}
}
}
//具体处理者角色2
class ConcreteHandler2 extends Handler{
public void handleRequest(String request){
if(request.equals("two")){
System.out.println("具体处理者2负责处理该请求!");
}else{
if(getNext()!=null){
getNext().handleRequest(request);
}else{
System.out.println("没有人处理该请求!");
}
}
}
}
6、状态模式
主管给码农们分配了不同的任务(状态)。码农们只能干自己的任务。
/**
* Created by xpeng on 2018/5/13.
* 定义一个电梯的接口
*/
public abstract class LiftState {
//定义一个环境角色,也就是封装状态的变换引起的功能变化
protected LiftState liftState;
public void setLiftState(LiftState liftState){
this.liftState = liftState;
}
public abstract void open();
public abstract void close();
public abstract void run();
public abstract void stop();
}
/**
* Created by xpeng on 2018/5/13.
* 在电梯停止的状态下能做什么事情
*/
public class StoppingState extends LiftState {
//停止状态,开门,是可以滴
@Override
public void open() {
super.contextState.setLiftState(ContextState.openningState);
super.contextState.getLiftState().open();
}
@Override
public void close() {
}
@Override
public void run() {
super.contextState.setLiftState(ContextState.runingState);
super.contextState.getLiftState().run();
}
@Override
public void stop() {
Log.e("xyz", " 电梯停止了... ");
}
}
7、原型模式
复用对象,重新对其属性赋值。