`
yaoweinan
  • 浏览: 138336 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

门面模式(Facade Pattern)

 
阅读更多

门面模式(Facade Pattern):门面模式在我个人感觉就是对使用者提供一个共同的外部调用方法,而把一些比较繁琐,或者使用者不必知道的东西不给使用者知道,换言之就是给你提供一个服务或者方法告诉你能干啥,其他的事情全部由内部程序搞定,在表面上达到统一、简易的操作。

下面举例说明:

现在网上购物已经十分流行了,在网购过程之中,我们首先需要选购商品,将物品添加到购物车,然后填写收货地址信息,最后进行网银付款,每次都要这么做,每次都是同一套流程。

现在假设我们有一个平台的商品都是统一的,质量不会存在啥问题,那么我们设想将网购这一复杂的过程简化,构建一更加简单的系统进行网购。客户主要提供给虚拟货币、收货地址、购买物品,将由我们设想的系统为客户筛选最便宜的物品,填写收货信息,结算、付款,这给客户带来了很大的方便,客户也不必知道自己真正的购物过程,只需要提供相应的信息就可以了。

实际代码如下:

 

网购流程接口:

package j2se.pattern;

import java.util.List;

/**
 * 网购流程
 * @author Lyon Yao
 *
 */
public interface NetShoppingProcess {
	/**
	 * 选取商品
	 * @param basket
	 */
	public void chooceGoods(List<Object> goods);
	/**
	 * 填写收货人信息
	 * @param address
	 * @param post
	 * @param name
	 */
	public void fillInReceiveAddress(String address,String post,String name);
	/**
	 * 付钱
	 * @param count
	 * @return float
	 */
	public float payForGoods(float count);
}

 网购过程实现:

package j2se.pattern;

import java.util.List;

/**
 * @author Lyon Yao
 *
 */
public class NetShoppingProcessImpl implements NetShoppingProcess {
	private float totalCount=0.0f;
	private Basket basket=new Basket();
	@Override
	public void chooceGoods(List<Object> goods) {
		// TODO Auto-generated method stub
			for(Object o:goods){
				//system find your goods On InterNet
				//suppose this 'o' is system found good
				this.basket.addGood(o);
			}
			System.out.println("goods are selected!");
	}

	@Override
	public void fillInReceiveAddress(String address, String post, String name) {
		// TODO Auto-generated method stub
			System.out.println("filling information about receiver!");
	}

	@Override
	public float payForGoods(float count) {
		// TODO Auto-generated method stub
			System.out.println("count total pay!");
			this.totalCount=1.1f;//假设物品总共1.1RMB
			float surplus= count-this.totalCount;
			System.out.println("pay for your goods!");
			
			return surplus;
	}

}

 购物车:

package j2se.pattern;

import java.util.ArrayList;
import java.util.List;

/**
 * 购物车
 * @author Lyon Yao
 *
 */
public class Basket {
	private List<Object> goods=new ArrayList<Object>(0);
	/**
	 * 列出购物车内所有的东西
	 * @return
	 */
	public List<Object> listGood(){
		return this.goods;
	}
	/**
	 * 添加物品
	 * @param object
	 */
	public void addGood(Object object){
		this.goods.add(object);
	}
	/**
	 * 删除物品
	 * @param object
	 */
	public void deleteGood(Object object){
		this.goods.remove(object);
	}
}

 我们提供服务的实现:

package j2se.pattern;

import java.util.List;

/**
 * 模式化购物
 * @author Lyon Yao
 *
 */
public class ModenNetShopping {
	private NetShoppingProcess process=new NetShoppingProcessImpl();
	public String netShopping(List<Object> toBuy,String address,String post,String name,float yourMoney){
		String msg="";
		
		this.process.chooceGoods(toBuy);
		this.process.fillInReceiveAddress(address, post, name);
		float surplus=process.payForGoods(yourMoney);
		if(surplus==0){
			msg="your money is just right for your goods!";
		}else if(surplus<0){
			msg="your moeny is not enough,please compensate "+Math.abs(surplus)+"RMB";
		}else {
			msg="your moeny is so enough,system hava  restituted you "+Math.abs(surplus)+"RMB";
		}
		return msg;
	}
}

 模拟人:

package j2se.pattern;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author Lyon Yao
 *
 */
public class Person {
	private String name;
	private String address;
	private String post;
	private float money=200.00f;
	public Person(String name, String address, String post) {
		super();
		this.name = name;
		this.address = address;
		this.post = post;
	}
	/**
	 * 购物
	 */
	public void Shopping(){
		List<Object> goods=new ArrayList<Object>();
		Object o=new Object();
		goods.add(o);
		ModenNetShopping sh=new ModenNetShopping();
		System.out.println(sh.netShopping(goods, address, post, name, money));
		
	}
}

 测试类:

package j2se.pattern;

import org.junit.Test;

public class TestCase {
	@Test
	public void test(){
		Person p=new Person("Lyon","ShanXi XiAn,China","710300");
		p.Shopping();
	}
}

 这样不管哪一个人进行网上购物,都是一个简单的过程,很多东西都不必关心。

另外将设我们平台要对服务者进行一些检查,或者限制,譬如说不让Lyon使用该平台购物,那么我们只需做如下改动。

 

检查接口:

package j2se.pattern;

/**
 * 检查
 * @author Lyon Yao
 *
 */
public interface Check {
	public boolean checkName(String name);
}
 

检查实现:

package j2se.pattern;

public class CheckImpl implements Check {

	@Override
	public boolean checkName(String name) {
		// TODO Auto-generated method stub
		// check the name
		if(name.equals("Lyon")){
			return true;
		}else{
			return false;
		}
	}

}
 

修改类ModenNetShopping如下:

package j2se.pattern;

import java.util.List;

/**
 * 模式化购物
 * @author Lyon Yao
 *
 */
public class ModenNetShopping {
	private NetShoppingProcess process=new NetShoppingProcessImpl();
	private Check check=new CheckImpl();
	public String netShopping(List<Object> toBuy,String address,String post,String name,float yourMoney){
		String msg="";
		if(check.checkName(name)){
			return "so sorry,we can't service for you!";
		}
		this.process.chooceGoods(toBuy);
		this.process.fillInReceiveAddress(address, post, name);
		float surplus=process.payForGoods(yourMoney);
		if(surplus==0){
			msg="your money is just right for your goods!";
		}else if(surplus<0){
			msg="your moeny is not enough,please compensate "+Math.abs(surplus)+"RMB";
		}else {
			msg="your moeny is so enough,system hava  restituted you "+Math.abs(surplus)+"RMB";
		}
		return msg;
	}
}

 这样以来,对于Person来说购物还是和原来一模一样,但结果却不尽相同了。

 

 

 

分享到:
评论

相关推荐

    设计模式 之 “门面模式[Facade Pattern]”

    门面模式(Facade Pattern)是软件工程中一种常用的结构型设计模式,它的主要目的是提供一个统一的接口,用来简化系统中一组复杂的接口或类的使用。这个模式将复杂的子系统接口封装在一个简单的门面对象中,使得...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    7、门面模式FACADE PATTERN 8、适配器模式ADAPTER PATTERN 9、模板方法模式TEMPLATE METHOD PATTERN 10、建造者模式BUILDER PATTERN 11、桥梁模式BRIDGE PATTERN 12、命令模式COMMAND PATTERN 13、装饰模式...

    第8讲_门面模式(Facade)

    门面模式(Facade Pattern)是一种设计模式,它在软件工程中扮演着简化复杂系统接口的角色。当一个系统或子系统包含大量类,并且客户端需要与这些类进行交互时,门面模式可以提供一个高层次的单一接口,使得客户端的...

    C++设计模式课件14_Facade_门面模式.pdf

    ### C++设计模式之门面模式(Facade Pattern) #### 一、门面模式概述 在软件工程领域,设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易...

    解析C#设计模式编程中外观模式Facade Pattern的应用

    外观模式(Facade Pattern)是设计模式中的一种结构型模式,其主要目的是为了简化客户端与复杂系统之间的交互。在C#编程中,外观模式通常用于减少客户端对子系统组件的依赖,提供一个统一的、高层次的接口,使得...

    facade门面模式

    门面模式(Facade Pattern)是一种结构型设计模式,它的主要目的是为复杂的子系统提供一个统一且简单的接口,使得客户端能够更方便地与这些子系统交互,而无需了解子系统的内部实现细节。这种模式降低了客户端与子...

    学习php设计模式 php实现门面模式(Facade)

    门面模式(Facade Pattern)是一种设计模式,它的主要目的是为了解决复杂系统中各个子系统的交互问题,提供一个简单的统一接口,使得客户端可以更轻松地使用这些子系统。这种模式在PHP开发中非常常见,特别是在处理...

    设计模式之门面模式

    门面模式(Facade Pattern)是软件工程中一种常用的设计模式,属于结构型模式。它提供了一个统一的接口,用来访问子系统中的一群接口。门面模式使得子系统的使用更为简单,同时也隐藏了子系统的复杂性,使得客户端...

    23种设计模式--门面模式

    门面模式(Facade Pattern)是软件工程中一种常用的设计模式,属于结构型模式。它为一个复杂的子系统提供了一个统一的接口,使得客户端可以更容易地使用这个子系统,而无需了解其内部的具体实现细节。在实际开发中,...

    门面模式(代码)

    门面模式(Facade Pattern)是一种设计模式,属于结构型模式,它的主要目的是为了解耦复杂的系统,提供一个统一的入口,使得外部客户端可以更简单、更方便地与系统交互,而无需关注系统的内部实现细节。在门面模式中...

    Java实现的门面模式

    门面模式(Facade Pattern)是设计模式中的一种结构型模式,它的主要目的是为了解决复杂的系统接口提供一个简单易用的统一入口。在Java中,门面模式的应用可以帮助我们更好地组织代码,降低系统的耦合度,提高代码的...

    门面模式门面模式

    门面模式(Facade Pattern)是一种结构型设计模式,它的主要目的是提供一个统一的接口,用来访问子系统中的一组接口。这个接口使得子系统更容易使用,同时也减少了客户端代码与子系统之间的耦合。门面模式通常用于...

    门面模式(PPT)

    门面模式(Facade Pattern)是一种设计模式,它在软件工程中扮演着简化复杂系统接口的角色。门面模式的核心思想是为一个复杂的子系统提供一个单一、简洁的接口,使得客户端可以更容易地理解和使用该子系统,而无需...

    设计模式之门面模式Java实现和类设计图

    门面模式(Facade Pattern)是软件工程中一种常用的设计模式,属于结构型模式,它提供了一个统一的接口,用于访问子系统中的一组接口。在面向对象设计中,门面模式为子系统提供了更简单的接口,使得客户端可以更容易...

    门面模式Demo

    门面模式(Facade Pattern)是一种结构型设计模式,它的主要目的是提供一个统一的接口,用于客户端访问复杂的子系统。在大型软件系统中,通常会有很多个子系统,每个子系统都有自己的职责,而门面模式就是为了让...

    JAVA设计模式.rar

    门面模式【FACADE PATTERN】  适配器模式【ADAPTER PATTERN】  模板方法模式【TEMPLATE METHOD PATTERN】  建造者模式【BUILDER PATTERN】 桥梁模式【BRIDGE PATTERN】  命令模式【COMMAND PATTERN...

    设计模式之门面模式(附demo)

    门面模式(Facade Pattern)是软件工程中一种结构型设计模式,它提供了一个统一的接口,用来访问子系统中的一组接口。这个统一的接口使得客户端不必了解子系统内部的复杂性,只需要与门面进行交互即可。门面模式简化...

Global site tag (gtag.js) - Google Analytics