另一个例子
让我们来看一下另外一个例子。在当前的系统中,有三种用户:常规用户,管理员和游客。
常规用户必须每隔90天修改一次密码(更频繁也行)。管理员必须每30天修改一次密码。游客就不需要修改了。
常规用户跟管理员可以打印报表。
先看一下当前的代码:
class UserAccount { final static int USERTYPE_NORMAL = 0; final static int USERTYPE_ADMIN = 1; final static int USERTYPE_GUEST = 2; int userType; String id; String name; String password; Date dateOfLastPasswdChange; public boolean checkPassword(String password) { ... } } class InventoryApp { void login(UserAccount userLoggingIn, String password) { if (userLoggingIn.checkPassword(password)) { GregorianCalendar today = new GregorianCalendar(); GregorianCalendar expiryDate = getAccountExpiryDate(userLoggingIn); if (today.after(expiryDate)) { //提示用户修改密码 ... } } } GregorianCalendar getAccountExpiryDate(UserAccount account) { int passwordMaxAgeInDays = getPasswordMaxAgeInDays(account); GregorianCalendar expiryDate = new GregorianCalendar(); expiryDate.setTime(account.dateOfLastPasswdChange); expiryDate.add(Calendar.DAY_OF_MONTH, passwordMaxAgeInDays); return expiryDate; } int getPasswordMaxAgeInDays(UserAccount account) { switch (account.getType()) { case UserAccount.USERTYPE_NORMAL: return 90; case UserAccount.USERTYPE_ADMIN: return 30; case UserAccount.USERTYPE_GUEST: return Integer.MAX_VALUE; } } void printReport(UserAccount currentUser) { boolean canPrint; switch (currentUser.getType()) { case UserAccount.USERTYPE_NORMAL: canPrint = true; break; case UserAccount.USERTYPE_ADMIN: canPrint = true; break; case UserAccount.USERTYPE_GUEST: canPrint = false; } if (!canPrint) { throw new SecurityException("You have no right"); } //打印报表 } } |
用一个对象代替一种类别(注意,之前是一个类代替一种类别)。
根据之前讲的解决方法,要去掉类别代码,我们只需要为每种类别创建一个子类,比如:
abstract class UserAccount { String id; String name; String password; Date dateOfLastPasswdChange; abstract int getPasswordMaxAgeInDays(); abstract boolean canPrintReport(); } class NormalUserAccount extends UserAccount { int getPasswordMaxAgeInDays() { return 90; } boolean canPrintReport() { return true; } } class AdminUserAccount extends UserAccount { int getPasswordMaxAgeInDays() { return 30; } boolean canPrintReport() { return true; } } class GuestUserAccount extends UserAccount { int getPasswordMaxAgeInDays() { return Integer.MAX_VALUE; } boolean canPrintReport() { return false; } } |
保留::
http://www.qqread.com/java/2007/12/w389616.html 
更多内容请看
Office技巧专区、
Java环境安装配置、
网管实用技巧100例专题,或
进入讨论组讨论。
【深 度 阅 读】 相 关 文 章