• 门面模式


    设计模式——门面模式

     

    一、引言

      很多时候我们只是知道一个物品,至于它是怎么产生的,我们不得而之。比如邮局里面是怎么操作信件的,我们只是需要将写的情信拿到邮箱就可以了,并不用理会它将通过怎么一个形式,或者怎么的途径将我表达的爱传播出去的。这也导致了之前我们很乐意的花钱买三聚氰胺奶粉来喝。

    二、门面模式

      1. 定义:门面模式了叫外观模式,它提供一个高层次的接口,使得子系统更易于使用,门面模式注重“统一对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生。

      2. 示意图:【如下图所示】

      3. 示意图说明:门面模式,是提供给客户调用的一个途径,使得客户端不必与底层的子系统进行交互。屏蔽高层对低层的直接访问。如图,当我们在Spring里取Bean的时候,只需要调用ServiceFacade就行了,而无须直接接触相应的Bean。

    三、门面模式示例

      1. Service

    复制代码
    package com.swyma.spring.service;
    
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Service;
    
    /**
     * 登录 Service
     * @author yemaoan
     *
     */
    @Service
    @Scope("prototype")
    public class LoginService extends BasicService {
    
        public void check(String username, String password) {
            
        }
        
        public void handle() {
            System.out.println("login handle");
        }
    }
    复制代码
    复制代码
    package com.swyma.spring.service;
    
    import org.springframework.stereotype.Service;
    
    /**
     * 注册 Service
     * @author yemaoan
     *
     */
    @Service
    public class RegisterService extends BasicService {
    
        public void create() {
            
        }
        
    }
    复制代码
    复制代码
    package com.swyma.spring.service;
    
    import org.springframework.stereotype.Service;
    
    import com.swyma.spring.entity.User;
    
    /**
     * 用户 Service
     * @author yemaoan
     *
     */
    @Service
    public class UserService extends BasicService {
    
        
        public void create(User user) {
            
        }
        
        public void modify(User user) {
            
        }
        
        public void delete(User user) {
            
        }
        
    }
    复制代码

      2. ServiceFacade

    复制代码
    package com.swyma.spring.service;
    
    import com.swyma.spring.core.ISpringContext;
    
    /**
     * Service门面
     * @author yemaoan
     *
     */
    public class ServiceFacade {
    
        /**
         * 取Spring上下文
         * @return
         */
        public static ISpringContext getContext() {
            ISpringContext context = new BasicSpringContext();
            return context;
        }
        
        public static LoginService getLoginService() {
            return getContext().lookup(LoginService.class);
        }
        
        public static UserService getUserService() {
            return getContext().lookup(UserService.class);
        }
        
        public static RegisterService getRegisterService() {
            return getContext().lookup(RegisterService.class);
        }
        
    }
    复制代码

      3. Client

    复制代码
    package com.swyma.spring.test;
    
    import org.junit.Test;
    
    import com.swyma.spring.core.ISpringContext;
    import com.swyma.spring.entity.User;
    import com.swyma.spring.service.BasicSpringContext;
    import com.swyma.spring.service.LoginService;
    import com.swyma.spring.service.RegisterService;
    import com.swyma.spring.service.ServiceFacade;
    import com.swyma.spring.service.UserService;
    
    
    /**
     * JUintTest
     * @author yemaoan
     *
     */
    public class TestSpringEnv {
        
        @Test
        public void testFacade() {
            ServiceFacade serviceFacade = new ServiceFacade();
            LoginService loginService = serviceFacade.getLoginService();
            loginService.handle();
        }
        
    }
    复制代码

    四、总结

      1. 门面是一个很好的封装方法,用于向客户端提供一个访问子系统的途径。

      2. 门面模式不参与子系统内的业务逻辑,即是它不能控制子系统的里规定的流程。

      3. 门面对象知晓子系统的全部功能和责任,它是一个没有实际业务逻辑的委托类。

     
    • 作者: swyma 
      出处: http://www.cnblogs.com/maoan/ 
      本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
     
    分类: 设计模式

    做个无边框winform窗体,并美化界面

     

    今天下午程序写完,有些时间就搞下界面美化,做个无框窗体。首先把窗体的FormBorderStyle设置为None,就变成无框的啦,不过你会发现这样窗体上就没有原来的最大最小化和关闭按钮了哦,所以要自己补上去。弄个panel放上去,置顶,可以设置panel的背景色和背景图片什么的,详细布局就不赘述啦,见下图,主要是再放三个小panel进去,用来做最小化、最大化、关闭按钮。下面给出三个panel的事件代码。

    关闭代码

    复制代码
            private void pnlFormClose_MouseClick(object sender, MouseEventArgs e)
            {
                DialogResult result = MessageBox.Show("是否退出?", "操作提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (result == DialogResult.Yes)
                {
                    //this.Dispose();
                    Application.Exit();
                }
            }
    复制代码

    最下化代码

            private void pnlFormMin_MouseClick(object sender, MouseEventArgs e)
            {
                this.WindowState = FormWindowState.Minimized;
            }

    这里最小化后可以加入最小化到桌面右下角,http://www.cnblogs.com/wuyouyu/p/3356303.html里已经写了相应代码。

    最大化代码,这里窗体正常状态点击则最大化,最大化状态点击则变为常态

    复制代码
            //最大化还原切换
            private bool max = false;
            private void pnlFormMax_MouseClick(object sender, MouseEventArgs e)
            {
                if (max)
                {
                    this.WindowState = FormWindowState.Normal;
                    max = false;
                }
                else
                {
                    this.WindowState = FormWindowState.Maximized;
                    max = true;
                }
            }
    复制代码

    最大化后,可以将最大化图片切换下,加句 this.pnlFormMax.BackgroundImage = Properties.Resources.要切换的图片名;

    这里说明下BackgroundImage图片导入的时候,有本地资源和项目资源文件两个选项,后者会生成Resources文件夹,存放导入的文件,否则就得写图片的物理地址了。

    三个按钮写完,基本工作还是没有结束,运行的时候会发现这个窗体不能拖动,要补充窗体可拖动代码,

    复制代码
    //窗体拖动
            private Point mousePoint = new Point();
            private void pnlCloseBar_MouseDown(object sender, MouseEventArgs e)
            {
                base.OnMouseDown(e);
                this.mousePoint.X = e.X;
                this.mousePoint.Y = e.Y;
            }
    
            private void pnlCloseBar_MouseMove(object sender, MouseEventArgs e)
            {
                base.OnMouseMove(e);
                if (e.Button == MouseButtons.Left)
                {
                    this.Top = Control.MousePosition.Y - mousePoint.Y;
                    this.Left = Control.MousePosition.X - mousePoint.X;
                }
            }
    复制代码

    到此基本工作做完。

    拓展:1、可以加入鼠标经过三个小panel时的效果,分别写MouseDown、MouseEnter、MouseLeave、MouseUp事件,切换下图片就行了。

    复制代码
            private void pnlFormMax_MouseLeave(object sender, EventArgs e)
            {
                if (!max)
                {
                    this.pnlFormMax.BackgroundImage = Properties.Resources.btn_FrmMax_Normal;
                }
                else
                {
                    this.pnlFormMax.BackgroundImage = Properties.Resources.btn_FrmRestore_Normal;
                }
            }
    复制代码

    2、可以加入双击窗体上边框,窗体最大化效果等。

    3、可以在右上角加入一个小panel作为设置按钮,用户可以自定义皮肤,窗体颜色,或者加入背景图片等。

     
     
    分类: c# winform
  • 相关阅读:
    JSON和Object数组在js中的转换
    Raphael绘制箭头arrow
    Web后台框架开发
    数据库开发
    docker
    git
    linux
    正则表达式工具
    python模拟ls命令
    python3基础
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3360387.html
Copyright © 2020-2023  润新知