◎筱米加步枪◎.Blog

Happy coding

外观模式

筱米加步枪 posted @ 2010年3月24日 06:27 in [ 设计模式 ] with tags 设计模式 外观模式 , 2094 阅读

今天,做完了公司的课题,无聊之余总结下之前的【外观模式】,看了这个模式的具体内容,很早以前就有用这样的思想了,只是不知道它叫外观模式。外观模式:实际上是提供一个经常使用的接口,这个接口他执行了许多子系统中的许多操作,使得用户不需要了解子系统中的具体操作,只需使用接口。这种例子是很常见的。

例如:我们知道用户、角色、权限三者关系,在早期,还没有角色的概念,只有用户和权限的概念,是直接讲权限赋予用户,但是后来为了方便管理,才引入角色的概念,把权限赋予角色,再把角色赋予用户。而角色就是我们外观模式中说的经常使用的接口,权限就是子系统,用户就是客户。

看下面的两个等价图:

1.有角色参与:

2.无角色参与:

可以看到,使用外观模式使的客户使用更方便,不需要了解子系统的过程,整个层次也更清晰。

无聊的实现了下这个代码:贴个纪念~~

1.权限类

/**
 * 权限类
 * 
 * @author ChenST
 *
 * @create 2010-3-24
 */
public class Right {
	
	/** 【添加】的权限 */
	public final static String ADD_RIGHT="【添加】";
	
	/** 【删除】的权限 */
	public final static String DELETE_RIGHT="【删除】";
	
	/** 【更新】的权限 */
	public final static String UPDATE_RIGHT="【更新】";
	
	/** 【查看】的权限 */
	public final static String SEE_RIGHT="【查看】";
}

2.角色抽象类

/**
 * 角色抽象类
 * 
 * @author ChenST
 *
 * @create 2010-3-24
 */
public abstract class Role {
	
	/** 角色拥有的权限*/
	private Set<String> rights;
	
	public Role(){
		this.rights=new HashSet<String>();
		//赋权操作
		this.addRight();
	}
	
	/**
	 * 添加权限
	 */
	public abstract void addRight();

	public Set<String> getRights() {
		return rights;
	}
}

3.管理员角色

/**
 * 超级管理员角色
 * 
 * @author ChenST
 *
 * @create 2010-3-24
 */
public class Admin extends Role{
	
	/*
	 * 添加全部的权限
	 * (non-Javadoc)
	 * @see facade.Role#addRight()
	 */
	@Override
	public void addRight() {
		this.getRights().add(Right.ADD_RIGHT);
		this.getRights().add(Right.DELETE_RIGHT);
		this.getRights().add(Right.SEE_RIGHT);
		this.getRights().add(Right.UPDATE_RIGHT);
	}
}

4.会员用户

/**
 * 会员用户
 * 
 * @author ChenST
 *
 * @create 2010-3-24
 */
public class Vip extends Role {

	/*
	 * 会员用户拥有【添加】权限
	 * (non-Javadoc)
	 * @see facade.Role#addRight()
	 */
	@Override
	public void addRight() {
		this.getRights().add(Right.ADD_RIGHT);
	}
}

5.普通用户角色

/**
 * 普通用户角色
 * 
 * @author ChenST
 *
 * @create 2010-3-24
 */
public class CommonUser extends Role{

	/*
	 * 普通用户只拥有【查看】的权限
	 * (non-Javadoc)
	 * @see facade.Role#addRight()
	 */
	@Override
	public void addRight() {
		this.getRights().add(Right.SEE_RIGHT);
	}
}

5.用户类

/**
 * 用户
 * 
 * @author ChenST
 *
 * @create 2010-3-24
 */
public  class User {
	
	/** 用户姓名 */
	private String name;
	
	/** 用户所拥有的角色 */
	private Set<Role> roles;
	
	public User(String name){
		this.name=name;
		roles=new HashSet<Role>();
	}
	
	/**
	 * 添加权限
	 * @param role
	 */
	public void addRole(Role role){
		this.roles.add(role);
	}
	
	/**
	 * 查看用户所拥有的权限
	 */
	public void lookRight(){
		System.out.println(this.name+"权限有:"+this.getRights());
	}

	/**
	 * 获取用户所拥有的权限
	 * @return
	 */
	public Set<String> getRights() {
		Set<String> rights=new HashSet<String>();
		for (Role role : roles) {
			for (String right: role.getRights()) {
				rights.add(right);
			}
		}
		return rights;
	}
}

6.测试类

/**
 * 测试类
 * 
 * @author ChenST
 *
 * @create 2010-3-24
 */
public class Test {

	public static void main(String[] args) {
		//创建用户james和green
		User james=new User("james");
		User green=new User("green");
		User joe=new User("joe");
		//创建三个角色 超级管理员,普通管理员,普通用户
		Role admin=new Admin();
		Role vip=new Vip();
		Role commonUser=new CommonUser();
		//给james赋予角色,赋予管理员和普通用户
		james.addRole(admin);
		james.addRole(commonUser);
		//给green赋予角色,赋予管理员
		green.addRole(admin);
		//给joe赋予角色,赋予管理员和会员
		joe.addRole(vip);
		joe.addRole(admin);
		//查看拥有的权限
		james.lookRight();
		green.lookRight();
		joe.lookRight();
	}
}

运行结果:

james权限有:[【删除】, 【更新】, 【查看】, 【添加】]
green权限有:[【删除】, 【更新】, 【查看】, 【添加】]
joe权限有:[【删除】, 【更新】, 【查看】, 【添加】]

可以看到,对于角色很好扩展和维护,对于权限的分配也可以很好维护,例如,会员用户要添加一个新的权限,那么则只要修改会员用户的权限,而不需要把相关的用户全部修改。OK~~


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter