当前位置: 首页 > news >正文

购买了网站如何使用宝安中心医院

购买了网站如何使用,宝安中心医院,joomla 做的网站,网站导航建设注意事项今天咱们要探索一下Java世界里的装饰模式#xff08;Decorator Pattern#xff09;。为了让这个过程更加生动易懂#xff0c;咱们就以大家都熟悉的咖啡饮品来举例吧#xff0c;想象一下#xff0c;你就是那个咖啡大师#xff0c;要给顾客调制出各种独特口味的咖啡哦…今天咱们要探索一下Java世界里的装饰模式Decorator Pattern。为了让这个过程更加生动易懂咱们就以大家都熟悉的咖啡饮品来举例吧想象一下你就是那个咖啡大师要给顾客调制出各种独特口味的咖啡哦 一、咖啡的基础简单的一杯咖啡 在我们的咖啡世界里首先得有一杯基础的咖啡呀。就好比是Java里的一个简单类它具备最基本的功能——能让你尝到咖啡的原味。 // 抽象的咖啡类定义了咖啡的基本行为获取描述和价格 abstract class Coffee {public abstract String getDescription();public abstract double getCost(); }// 具体的咖啡实现类这里是简单的黑咖啡 class BlackCoffee extends Coffee {Overridepublic String getDescription() {return 黑咖啡;}Overridepublic double getCost() {return 2.0; // 假设黑咖啡的价格是2元} }看这里我们有了一个抽象的 Coffee 类它规定了所有咖啡都应该能告诉我们它的描述是什么咖啡以及价格。然后 BlackCoffee 就是最基础的那种黑咖啡啦原汁原味价格也相对简单。 二、装饰模式登场给咖啡加点料 现在呢顾客们可不会满足于仅仅只有黑咖啡呀他们可能想要加糖、加冰或者加牛奶来调出自己喜欢的口味。这时候装饰模式就该闪亮登场啦 装饰模式的核心思想就是在不改变原有对象这里就是黑咖啡结构的基础上动态地给它添加一些额外的功能比如加糖、加冰等。 我们先创建一个抽象的装饰者类它和咖啡类一样也实现了 Coffee 接口这样它就能“伪装”成一杯咖啡啦。 // 抽象的咖啡装饰者类继承自Coffee类可以用来装饰其他咖啡对象 abstract class CoffeeDecorator extends Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee coffee;}Overridepublic String getDescription() {return decoratedCoffee.getDescription();}Overridepublic double getCost() {return decoratedCoffee.getCost();} }这个抽象装饰者类有一个很重要的成员变量 decoratedCoffee它用来保存被装饰的那个咖啡对象哦。而且注意啦它的 getDescription 和 getCost 方法默认是返回被装饰咖啡的描述和价格因为我们还没开始添加额外的东西嘛。 三、具体的装饰者糖、冰、牛奶来啦 接下来咱们就可以创建具体的装饰者类啦分别对应着加糖、加冰和加牛奶。 加糖装饰者 // 加糖装饰者类给咖啡加糖 class SugarDecorator extends CoffeeDecorator {public SugarDecorator(Coffee coffee) {super(coffee);}Overridepublic String getDescription() {return decoratedCoffee.getDescription() , 加了糖;}Overridepublic double getCost() {return decoratedCoffee.getCost() 0.5; // 假设糖的价格是0.5元} }看呀当我们用 SugarDecorator 去装饰一杯咖啡比如黑咖啡的时候它会在原来咖啡的描述后面加上“加了糖”而且价格也会相应地增加0.5元哦就好像真的给咖啡加了一份甜蜜的魔法呢 加冰装饰者 // 加冰装饰者类给咖啡加冰 class IceDecorator extends CoffeeDecorator {public IceDecorator(Coffee coffee) {super(coffee);}Overridepublic String getDescription() {return decoratedCoffee.getDescription() , 加了冰;}Overridepublic double getCost() {return decoratedCoffee.getCost() 0.3; // 假设冰的价格是0.3元} }哇哦IceDecorator 一上场咖啡就变得清凉爽口啦描述里多了“加了冰”价格也稍微涨了一点点毕竟冰块也是有成本的嘛。 加牛奶装饰者 // 加牛奶装饰者类给咖啡加牛奶 class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}Overridepublic String getDescription() {return decoratedCoffee.getDescription() , 加了牛奶;}Overridepublic double getCost() {return decoratedCoffee.getCost() 1.0; // 假设牛奶的价格是1元} }嘿嘿加了牛奶的咖啡感觉更加香浓醇厚了呢描述变得更诱人价格也因为加了牛奶而有所增加啦。 四、调制一杯独特的咖啡 现在咱们就可以像个真正的咖啡大师一样开始调制各种独特口味的咖啡啦 public class CoffeeShop {public static void main(String[] args) {// 先制作一杯黑咖啡Coffee coffee new BlackCoffee();System.out.println(您点了一杯 coffee.getDescription() 价格是 coffee.getCost() 元);// 给黑咖啡加糖coffee new SugarDecorator(coffee);System.out.println(现在您的咖啡变成了 coffee.getDescription() 价格是 coffee.getCost() 元);// 再加冰coffee new IceDecorator(coffee);System.out.println(哇哦又加了冰现在是 coffee.getDescription() 价格是 coffee.getCost() 元);// 最后再加牛奶coffee new MilkDecorator(coffee);System.out.println(终极版咖啡来啦 coffee.getDescription() 价格是 coffee.getCost() 元);} }运行上面的代码你就会看到一杯普通的黑咖啡是如何一步步变成一杯超级豪华、口味独特的咖啡的哦。就像这样 您点了一杯黑咖啡价格是2.0元 现在您的咖啡变成了黑咖啡, 加了糖价格是2.5元 哇哦又加了冰现在是黑咖啡, 加了糖, 加了冰价格是2.8元 终极版咖啡来啦黑咖啡, 加了糖, 加了冰, 加了牛奶价格是3.8元是不是很有趣呀通过装饰模式我们可以非常灵活地根据顾客的需求给咖啡添加各种各样的配料而且每添加一种配料咖啡的描述和价格都会相应地发生变化就好像真的在现实生活中的咖啡店里调制咖啡一样呢 五、装饰模式在SpringBoot中的应用场景 聊完了装饰模式的基本概念和示例咱们再来说说它在SpringBoot这个强大的框架中是怎么大展身手的吧。 场景一日志增强 在一个SpringBoot应用中我们经常需要记录各种操作的日志。假设我们有一个简单的服务接口 UserService它提供了一些用户相关的操作方法比如 addUser()添加用户、updateUser()更新用户信息等等。 public interface UserService {void addUser(User user);void updateUser(User user); }public class UserServiceImpl implements UserService {Overridepublic void addUser(User user) {// 实际添加用户的逻辑System.out.println(添加用户 user.getName());}Overridepublic void updateUser(User user) {// 实际更新用户信息的逻辑System.out.println(更新用户 user.getName());} }现在我们想要在每个方法调用前后都记录详细的日志包括方法名、传入的参数、执行时间等等。如果直接在 UserServiceImpl 类里面添加日志记录的代码会让这个服务类变得很杂乱而且不符合单一职责原则。这时候装饰模式就可以派上用场啦 我们可以创建一个日志装饰器 LoggingDecorator它实现了 UserService 接口并且持有一个 UserService 的引用。 public class LoggingDecorator implements UserService {private final UserService userService;public LoggingDecorator(UserService userService) {this.userService userService;}Overridepublic void addUser(User user) {long startTime System.currentTimeMillis();System.out.println(开始执行 addUser 方法参数 user);userService.addUser(user);long endTime System.currentTimeMillis();System.out.println(addUser 方法执行完毕耗时 (endTime - startTime) 毫秒);}Overridepublic void updateUser(User user) {long startTime System.currentTimeMillis();System.out.println(开始执行 updateUser 方法参数 user);userService.updateUser(user);long endTime System.currentTimeMillis();System.out.println(updateUser 方法执行完毕耗时 (endTime - startTime) 毫秒);} }然后在配置SpringBoot的Bean时我们可以这样来使用这个装饰器 Configuration public class AppConfig {Beanpublic UserService userService() {UserService userServiceImpl new UserServiceImpl();return new LoggingDecorator(userServiceImpl);} }这样当我们在其他地方注入 UserService 并调用它的方法时就会自动记录详细的日志啦而且 UserServiceImpl 类本身的代码依然保持简洁专注于实现用户服务的核心逻辑。 场景二权限验证增强 再比如我们的应用中有一些需要权限验证的接口只有具有特定权限的用户才能访问。假设我们有一个 OrderService它提供了一些订单相关的操作方法比如 createOrder()创建订单、cancelOrder()取消订单等等。 public interface OrderService {void createOrder(Order order);void cancelOrder(Order order); }public class OrderServiceImpl implements OrderService {Overridepublic void createOrder(Order order) {// 实际创建订单的逻辑System.out.println(创建订单 order.getOrderId());}Overridepublic void cancelOrder(Order order) {// 实际取消订单的逻辑System.out.println(取消订单 order.getOrderId());} }现在我们想要在调用这些订单操作方法之前先进行权限验证。同样的我们可以创建一个权限验证装饰器 PermissionDecorator。 public class PermissionDecorator implements OrderService {private final OrderService orderService;public PermissionDecorator(OrderService orderService) {this.orderService orderService;}Overridepublic void createOrder(Order order) {if (hasPermission()) { // 这里假设已经有一个方法来判断是否有权限orderService.createOrder(order);} else {throw new RuntimeException(没有权限创建订单);}}Overridepublic void cancelOrder(Order order) {if (hasPermission()) {orderService.cancelOrder(order);} else {throw new RuntimeException(没有权限取消订单);}}private boolean hasPermission() {// 实际的权限验证逻辑这里简单返回true模拟有权限return true;} }然后在SpringBoot的配置中这样使用 Configuration public class AppConfig {Beanpublic OrderService orderService() {OrderService orderServiceImpl new OrderServiceImpl();return new PermissionDecorator(orderServiceImpl);} }这样每次调用订单服务的方法时都会先进行权限验证如果没有权限就会抛出异常而 OrderServiceImpl 类本身不需要关心权限验证的事情只专注于订单业务逻辑的实现。 通过这两个例子我们可以看到在SpringBoot中装饰模式可以很好地帮助我们在不修改原有业务逻辑类的基础上对其功能进行增强比如添加日志记录、权限验证等额外的职责让我们的代码更加清晰、可维护和可扩展。 六、总结一下 好啦咱们这次探索了Java设计模式中的装饰模式。这个模式的优点可不少哦它让我们可以在不修改原有类的基础上动态地扩展对象的功能非常符合开闭原则对扩展开放对修改关闭。就像我们给咖啡添加配料一样不需要去改动原来的黑咖啡类只需要创建新的装饰者类就可以啦。
http://www.hkea.cn/news/14381073/

相关文章:

  • 网站建设规划书txt微盘营销策略有哪几种
  • 展展示型网站开发网站建设培训 ppt
  • 成都建站提供商百度搜寻网站缩略图如何添加
  • 东莞seo托管竞价页面网站做优化
  • 建站空间哪个好哪里有门户网站开发
  • 网站服务器错误403北京优化seo排名
  • 铭泰东莞网站建设电子商务网站开发系统平台
  • 华为erp企业管理系统软件网站优化推广哪家好
  • xampp做网站九江市建设规划局网站
  • 怎样创造一个网站wordpress小程序前端
  • 免费申请网站域名软件设计的过程
  • 产品网站建设个旧市建设局网站
  • 深圳市做网站的做系统网站提醒有风险
  • 更改wordpress程序站点网址在线网站开发培训
  • 网站开发模块学些什么html友情链接代码
  • 网站更新和维护怎么做做网站的版式会侵权吗
  • 请人做网站谁来维护鞍山网站建设公司
  • 深圳制作网站主页app软件开发公司排行
  • 网站开发从什么学起wordpress和域名
  • 山东临沂网站推广公司注册地址费用
  • 高仿网站源码asp网站开发的主要困难
  • 做个电商网站温州做微网站设计
  • 科右中旗网站建设做网站横幅的图片多大
  • 中国有名的模版网站常见的网络推广工具
  • 怎么诊断网站邢台物流网站建设
  • 推广网站可以做跳转吗wordpress啥意思
  • 济南高新区建设局网站极简风格wordpress主题
  • 一个网站需要多少容量太原百度关键词优化
  • 清远网站开发注册个网站域名多少钱一年
  • 家电维修怎么自己做网站wordpress安卓源码分析