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

网站静态页面下载工具专门做2手手机的网站

网站静态页面下载工具,专门做2手手机的网站,商城网站设计注意什么,php网站建设一流程一、什么是设计模式#xff1f; 设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问#xff0c;设计模式于己于他人于系统都是多赢的#xff0c;设计模式使代码编制真正工程化#xff0c;设计模式是软件工程的基石#xff0c;如同大厦的一块块…一、什么是设计模式 设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问设计模式于己于他人于系统都是多赢的设计模式使代码编制真正工程化设计模式是软件工程的基石如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题每种模式在现在中都有相应的原理来与之对应每一个模式描述了一个在我们周围不断重复发生的问题以及该问题的核心解决方案这也是它能被广泛应用的原因。设计模式Design pattern是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 好了上面其实都是废话摘抄的别人的。 开发好几年了没有特别去注意过自己的项目设计要怎样怎样其实在无形中实现了各种各样的设计模式。在这儿做个总结。 二、设计模式的六个原则 设计模式的 六大原则 是软件设计的核心思想它们确保代码的 高内聚、低耦合提高代码的 可读性、扩展性和维护性。 1、迪米特法则又称最少知道原则Demeter Principle 2、里氏替换原则即基类和子类之间的关系。子类可以扩展父类的功能但不能改变父类原有的功能。也就是说子类继承父类时除添加新的方法完成新增功能外尽量不要重写父类的方法。 3、依赖倒转原则即降低客户与实现模块之间的耦合。就是该用抽象类和接口的时候尽量用不要去依赖具体的实现类。 高层模块不应该依赖低层模块而应该依赖抽象细节具体实现应该依赖于抽象接口 4、接口隔离原则不要强迫一个类实现它用不到的接口应拆分接口让接口更小更具体。 比如一个人有生活工作和睡觉每个事物都有很多方法去实现不应该把它全放在人这个接口而是拆分出去。避免无用方法。 5.开闭原则对扩展开放对修改关闭即在不修改已有代码的情况下允许扩展功能。 避免修改已有代码减少风险支持扩展提高系统的灵活性 6.单一职责原则一个类应该 只有一个引起它变化的原因即一个类只做一件事。别一个类把所有事儿包圆了代码臃肿且不好维护迭代。 三、开发者常用到的设计模式及案例 1.单例模式 作用确保某个类在整个应用生命周期中只有一个实例并提供一个全局访问点。这个在开发中会经常使用到。 场景 全局管理对象如 SharedPreferences、数据库 Room 实例网络请求管理Retrofit应用程序级别的配置管理 示例1:retrofitkotlin object RetrofitClient {private val retrofit: Retrofit by lazy {Retrofit.Builder().baseUrl(https://api.example.com/).addConverterFactory(GsonConverterFactory.create()).build()}fun getService(): ApiService retrofit.create(ApiService::class.java) }优点使用 lazy 懒加载只有在真正需要时才会创建 Retrofit 实例避免应用启动时的额外资源占用。 当然我现在项目使用的是枚举enum enum class RetrofitManager {INSTANCE;val retrofit: Retrofitinit {retrofit getRetrofitObject()}private fun getRetrofitObject(): Retrofit {val client OkHttpClient.Builder().connectTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS).build()return Retrofit.Builder().baseUrl(AppAPI.BASE_URL).client(client).addConverterFactory(GsonConverterFactory.create()).build()} }在 Kotlin 中使用 enum class 创建单例是有效的因为 枚举的实例是唯一的 INSTANCE 只会在 RetrofitManager 类加载时创建一次符合单例模式的定义。JVM 保证枚举单例的线程安全 enum 的实例在类加载时就初始化JVM 确保只有一个实例避免了反射攻击和反序列化创建新实例的问题。 2.工厂模式 作用通过工厂方法创建对象而不是直接 new提高代码的可扩展性和维护性。 场景 不同类型的 ViewHolder 创建不同类型的对话框Dialog创建网络请求数据解析如 Gson TypeAdapter 例如我们在实现一个多类型的列表时需要在 onCreateViewHolder() 里写多个 when 语句进行条件判断去inflate不同的布局。 例如 override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): RecyclerView.ViewHolder {return if (viewType TYPE_ITEM) {val view LayoutInflater.from(parent.context).inflate(R.layout.item_home_more_type, parent, false)MoreVm(view, itemClickListener)} else {val view LayoutInflater.from(parent.context).inflate(R.layout.item_footer_loading, parent, false)FooterViewHolder(view)}} 这时候我们就可以用到工厂模式可以提高代码复用性。 class ViewHolderFactory {companion object {fun create(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {return when (viewType) {TYPE_TEXT - TextViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_text, parent, false))TYPE_IMAGE - ImageViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_image, parent, false))else - throw IllegalArgumentException(Unknown viewType: $viewType)}}} }3.观察者模式 作用允许对象间定义一对多的依赖关系当一个对象状态改变时所有依赖它的对象都会收到通知。 场景 LiveData ViewModelMVVM 架构EventBus / RxJava广播接收器BroadcastReceiver 这个在现在的开发里用的地方太多了示例: class MyViewModel : ViewModel() {val userData: MutableLiveDataString MutableLiveData()fun updateUserData(newData: String) {userData.value newData}fun requestData(){...updateUserData(newData)...} }// Activity 中监听数据变化 viewModel.userData.observe(this, Observer { data -textView.text data })4.策略模式 作用定义一组算法把它们封装起来并使它们可以互相替换。 场景 不同的图片加载策略Glide/Picasso不同的动画策略不同的网络请求缓存策略 示例 interface ImageLoaderStrategy {fun loadImage(context: Context, url: String, imageView: ImageView) }class GlideImageLoader : ImageLoaderStrategy {override fun loadImage(context: Context, url: String, imageView: ImageView) {Glide.with(context).load(url).into(imageView)} }class PicassoImageLoader : ImageLoaderStrategy {override fun loadImage(context: Context, url: String, imageView: ImageView) {Picasso.get().load(url).into(imageView)} }// 使用 val imageLoader: ImageLoaderStrategy GlideImageLoader() imageLoader.loadImage(context, https://example.com/image.jpg, imageView)优势让不同的策略可以在运行时切换提升代码的灵活性。在平时的开发里我会用于判断图片大小是否对图片压缩图片的缓存方式进行策略模式的设计 5. 责任链模式 作用将多个处理逻辑串联起来按照顺序依次处理请求直到满足条件的处理器处理完成。记住责任链模式中的每个处理节点拦截器、处理者可以选择是否处理请求或将其传递给下一个处理者。所谓的链式调用并不符合这个设计模式。 场景 OkHttp 的拦截器InterceptorAndroid 事件分发onTouchEvent权限请求链 示例 private fun getRetrofitObject(): Retrofit {val loggingInterceptor HttpLoggingInterceptor { message -LogUtils.i(RetrofitLog, retrofitBack $message)}.apply { level HttpLoggingInterceptor.Level.BODY }val client OkHttpClient.Builder().addInterceptor(loggingInterceptor).addInterceptor(HeaderInterceptor()).connectTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS).build()return Retrofit.Builder().baseUrl(AppAPI.BASE_URL).client(client).addConverterFactory(GsonConverterFactory.create()).build()} } 优势可以动态地添加或移除责任节点提高代码的扩展性。我上面就设置了日志拦截器和请求拦截器 灵活性你可以自由添加或删除拦截器改变请求和响应的处理顺序。可扩展性每个拦截器都可以独立工作允许按需添加处理逻辑形成一个灵活的扩展点。解耦每个拦截器只关注自己需要处理的任务不必知道其他拦截器的逻辑符合单一职责原则。 6. 适配器模式 作用将一个接口转换成客户端期望的接口使不兼容的类可以协同工作。 场景 RecyclerView 适配器Adapter数据库适配Room 例如后端返回的数据更改了变成了 {userId: 12345,user_name: Lee,user_email: leeexample.com }而我之前设计的实体类是 data class UserProfile(val id: String,val name: String,val email: String )这时候我只需要写一个方法 // 适配器类将 API 数据转换为 UserProfile 结构 class UserAdapter(private val apiData: ApiUser) {fun toUserProfile(): UserProfile {return UserProfile(id apiData.userId,name apiData.user_name,email apiData.user_email)} }有一说一我这个示例很简陋能力有限在需求开发中在这种场景使用过。 优势 桥接不同的数据结构避免 API 数据格式和 UI 组件直接绑定提升代码灵活性。让已有代码无需修改只需更改适配器保持项目稳定。提高代码复用性适配器可以被多个 UI 组件或业务模块复用。 7. 代理模式Proxy Pattern 作用为对象提供一个代理类控制对原对象的访问。 场景 动态权限申请ActivityCompat.requestPermissionsRetrofit 动态代理AOPAspect-Oriented Programming例如retrofit的日志拦截埋点等AOP面向切面编程主要是基于代理模式实现的但它不仅仅局限于代理模式还可以结合字节码操作如 ASM、Javassist和编译器插桩AspectJ等方式。 AOP 本质上就是通过代理模式在不修改原代码的情况下动态地增强功能如日志、权限控制、监控等。 在 AOP 的实现中通常使用 动态代理JDK 动态代理、CGLIB 代理 来拦截方法调用并在方法执行前后执行额外的逻辑。 代理模式核心思路 静态代理预先定义代理类手动编写代理逻辑适用于少量接口。动态代理运行时生成代理对象动态添加方法增强适用于大规模 AOP。字节码操作直接修改 .class 字节码如 ASM、Javassist、AspectJ。 说来惭愧这个设计模式我在自己的项目开发里并没有如何去设计过不过去了解了一下 可以使用 Kotlin 注解 反射 实现AOP进行方法执行时间拦截。 示例1 //定义一个注解 Target(AnnotationTarget.FUNCTION) Retention(AnnotationRetention.RUNTIME) annotation class TimeLog//在我要使用的方法上加一个注解 class TestClass {TimeLogfun testMethod() {Thread.sleep(500) // 模拟耗时操作} } // 使用反射 AOP 拦截 fun logExecutionTime(obj: Any) {val methods obj::class.java.declaredMethodsfor (method in methods) {if (method.isAnnotationPresent(TimeLog::class.java)) {val start System.currentTimeMillis()method.invoke(obj) // 调用方法val end System.currentTimeMillis()Log.d(AOP, ${method.name} 执行时间: ${end - start}ms)}} }val test TestClass() logExecutionTime(test)示例2:使用 AspectJ编译期 AOP 目的无须修改任何activity代码监听 Activity 生命周期自动埋点 Aspect class LifecycleAspect {Before(execution(* android.app.Activity.onCreate(..)))fun beforeOnCreate(joinPoint: JoinPoint) {val activity joinPoint.target as ActivityLog.d(AOP, Activity ${activity::class.java.simpleName} - onCreate)} }常用的三方库里面很多都是基于上述的设计模式去实现的我自己一般可能就只会用到前面四个哈哈哈
http://www.dnsts.com.cn/news/111865.html

相关文章:

  • 做网站还赚钱吗怎样建立公司网页
  • 网站收录下降原因学服装设计后悔死了
  • 山西做网站怎么做游戏网站建设杭州
  • 淘宝cms建站wordpress 传值
  • 英文网站seo发展前景微信公众平台注册官网登录入口
  • 企业网站运营方案公司网站建设服务费入什么科目
  • 公司网站建设款计什么科目网络公关的作用
  • 网站如何做下拉菜单建设银行网站打开自动关闭
  • 建设个人网站的心得体会温州网站快速排名
  • 网站备案有什么好处理jiathis wordpress
  • 学校网站制作多少钱电器网站制作价格
  • 爱站网怎么使用网络推广培训公司
  • 山东住房和城乡建设局网站首页seo网站结构如何优化
  • 做水产有什么网站海外广告优化师
  • 网站建设 艺麟盛世建设工程合同包括哪些合同?
  • 中等职业学校网站建设模块淮安制作企业网站
  • 蓝彩网络科技_齐齐哈尔微信营销_齐齐哈尔网站建设网站seo推广营销
  • 南通制作企业网站重庆快建网站
  • 广东网站设计哪家好wordpress哪个模板好用
  • wordpress搭建下载站网站开发的技术解决方案
  • 电商网站推广常见问题网站开发课程安排
  • 安陆市城乡建设局网站网站后台框架下载
  • 濮阳建站建设网页搜索历史怎么找到
  • 建设网站服务器自营方式的特点虚拟商品交易网站建设
  • 北京电子商务网站制作h5页面怎么做
  • 专项培训网站建设方案wordpress 延迟加载插件
  • 有专门做食品的网站吗百度关键词优化排名
  • 爱情动做网站推荐展示型网站包含哪些模块
  • 建设一个素材网站淘宝网店怎么注册开店
  • 嘉峪关市建设局建管科资质网站wordpress切换语言实现